쉬면서 다양한 언어를 건들여보고있다.
Swift, C#, C++등을 해보고 있는데 학창시절에 해봤던 C++이 가장 취향에 잘 맞는 것 같다. 왜 인지는 모르겠음..
#include <iostream>
using namespace std;
typedef struct Animal {
char name[30];
int age;
int health;
int hunger;
int clean;
} Animal;
void create_animal(Animal *animal) {
cout << "name: ";
cin >> animal -> name;
cout << "age: ";
cin >> animal -> age;
animal -> health = 100;
animal -> hunger = 100;
animal -> clean = 100;
}
void play(Animal *animal) {
cout << "Hell, yeah";
animal -> health += 10;
animal -> hunger -= 10;
animal -> clean -= 10;
cout << animal -> health << endl;
cout << animal -> hunger << endl;
cout << animal -> clean << endl;
}
void show_status(Animal *animal) {
cout << animal -> name << endl;
cout << "health: "<< animal -> health << endl;
cout << "hunger: "<< animal -> hunger << endl;
cout << "clean: "<< animal -> clean << endl;
}
int main() {
Animal *list[10];
int animal_num = 0;
for (;;) {
int input;
char cases[5][30] = {
"1. Add animal",
"2. play",
"3. status",
"4. list of animals",
"5. exit"
};
for (int i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
cout << cases[i] << endl;
}
cin >> input;
switch (input) {
case 1:
list[animal_num] = new Animal;
create_animal(list[animal_num]);
animal_num++;
break;
case 2:
play(list[animal_num - 1]);
break;
case 3:
show_status(list[animal_num - 1]);
default:
cout << "Invalid input" << endl;
break;
}
}
}
상단 예제는 모두의 코드 에서 제공되는 예제에서 조금의 변형이 있다.
// 기존예제
std::cout << "1. 동물 추가하기" << std::endl;
std::cout << "2. 놀기 " << std::endl;
std::cout << "3. 상태 보기 " << std::endl;
// 변형
char cases[5][30] = {
"1. Add animal",
"2. play",
"3. status",
"4. list of animals",
"5. exit"
};
아무래도 다양한 메뉴를 추가, 삭제 하기 위해서 배열 형태로 관리하는게 좋을 것 같았다.
그리고 구조체를 C문법으로 작성했고 C에서는 구조체를 수정하기 위해서는 포인터로 넘겨야했다.
그래서 구조체 및 함수 부분을 C++스타일로 변경하면 아래와 같다.
struct Animal {
string name;
int age;
int health = 100;
int hunger = 100;
int clean = 100;
} ;
void create_animal(Animal &animal) {
cout << "name: ";
cin >> animal.name;
cout << "age: ";
cin >> animal.age;
}
void play(Animal &animal) {
cout << "Hell, yeah";
animal.health += 10;
animal.hunger -= 10;
animal.clean -= 10;
cout << animal.health << endl;
cout << animal.hunger << endl;
cout << animal.clean << endl;
}
void show_status(Animal &animal) {
cout << animal.name << endl;
cout << "health: "<< animal.health << endl;
cout << "hunger: "<< animal.hunger << endl;
cout << "clean: "<< animal.clean << endl;
}
// 중략
int main() {
// 기존
Animal *list[10];
// 변경
Animal list[10];
}
// 중략
// 기존
case 1:
list[animal_num] = new Animal; // 동적 할당
create_animal(list[animal_num]);
animal_num++;
// 변경
case 1:
create_animal(list[animal_num]);
animal_num++;
포인터 배열을 선언하면 배열의 주소만을 가지게 된다.
그래서 실제 객체를 선언해주기 위해 new를 사용해야했다.
레퍼런스로 변경하면서 선언 자체를 포인터 배열이 아닌 실제 객체배열로 했고
이미 메모리 상 존재하는 객체를 참조하기 때문에 new/delete를 통해 메모리 관리를 해줄 필요가 없어진다.