TIL: C++ 기초 2025.11.10

박춘팔·4일 전
0

CPP TIL

목록 보기
1/2
post-thumbnail

쉬면서 다양한 언어를 건들여보고있다.
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를 통해 메모리 관리를 해줄 필요가 없어진다.

profile
이것 저것 다해보는 삶

0개의 댓글