게임 개발자를 위한 C++ 문법 1-6, 7

1. WHAT
- 클래스 상속

class Vehicle {
protected: //자식 클래스에서 접근 가능
string color;
int speed;
...
};
class Bicycle : public Vehicle { //public 상속, Vehicle --> Bicycle
private:
bool hasBasket;
public: //생성자 멤버 초기화 리스트에서 부모 생성자 초기화!
Bicycle(string c, int s, bool basket) : Vehicle(c, s), hasBasket(basket) {}
void ringBell() {
cout << "Bicycle bell: Ring Ring!" << endl;
}
};
- 다형성

가상함수 virtual: 동적바인딩을 통해 실제 호출된 객체의 타입에 따라 적절한 파생 클래스의 함수가 실행되도록 함
기본 클래스에서 함수의 인터페이스 정의 > 파생 클래스에서 실제 구현

//가상함수
#include <iostream>
using namespace std;
// 기본 클래스: Animal
class Animal {
public:
// 가상 함수: 자식 클래스에서 재정의 가능
virtual void makeSound() {
cout << "Animal makes a sound." << endl;
}
};
// 파생 클래스: Dog
class Dog : public Animal {
public:
void makeSound() {
cout << "Dog barks: Woof! Woof!" << endl;
}
};
// 파생 클래스: Cat
class Cat : public Animal {
public:
void makeSound() {
cout << "Cat meows: Meow! Meow!" << endl;
}
};
int main() {
// Animal 타입 포인터로 다양한 객체를 가리킴
Animal* myAnimal;
Dog myDog;
Cat myCat;
// Dog 객체 가리키기
myAnimal = &myDog;
myAnimal->makeSound(); // Dog의 makeSound() 호출
// Cat 객체 가리키기
myAnimal = &myCat;
myAnimal->makeSound(); // Cat의 makeSound() 호출
return 0;
}
//순수가상함수
#include <iostream>
using namespace std;
// 기본 클래스: Animal
class Animal {
public:
// 가상 함수: 자식 클래스에서 재정의 가능
virtual void makeSound() = 0;
};
// 파생 클래스: Dog
class Dog : public Animal {
public:
void makeSound() {
cout << "Dog barks: Woof! Woof!" << endl;
}
};
// 파생 클래스: Cat
class Cat : public Animal {
public:
void makeSound() {
cout << "Cat meows: Meow! Meow!" << endl;
}
};
int main() {
// Animal 타입 포인터로 다양한 객체를 가리킴
Animal* myAnimal;
Dog myDog;
Cat myCat;
// Dog 객체 가리키기
myAnimal = &myDog;
myAnimal->makeSound(); // Dog의 makeSound() 호출
// Cat 객체 가리키기
myAnimal = &myCat;
myAnimal->makeSound(); // Cat의 makeSound() 호출
return 0;
}
순수 가상 함수: 기본 클래스에서 구현하지 않고, 반드시 파생 클래스에서 구현하도록 강제하는 가상 함수
추상 클래스: 순수 가상 함수를 하나 이상 포함하는 클래스, 직접 인스턴스를 생성X 포인터 혹은 참조를 통해서만 사용
2. RESULT
- 미니 실습 (1-5)
#include <iostream>
using namespace std;
class Car {
private:
string modelName;
int speed;
public:
Car(string name):modelName(name),speed(0){}
void Accelerate() {
speed += 10;
}
void Brake() {
if (speed >= 10) {
speed -= 10;
}
}
void DisplayInfo() {
cout << "자동차 이름: " << modelName << ", 현재 속도: " << speed << endl;
}
};
int main() {
string name;
cout << "자동차 이름 입력: ";
cin >> name;
Car Car1(name);
while(true)
{
Car1.DisplayInfo();
int num;
cout << "1)가속 2)브레이크 3)종료" << endl;
cout << "입력: ";
cin >> num;
if (num == 1) {
Car1.Accelerate();
}
else if (num == 2) {
Car1.Brake();
}
else if (num == 3)
break;
}
return 0;
}

- 도전 실습 (1-5)
#include <iostream>
using namespace std;
class Thermometer {
private:
int currentTemp;
bool mode; //true: 섭씨, false: 화씨
public:
void setter(int temp) { //섭씨 기준 온도 설정
if (temp <= 100 && temp >= -100)
currentTemp = temp;
else
currentTemp = 0;
mode = true;
}
void modeSwitch() { //모드 전환
if (mode)
mode = false;
else
mode = true;
}
void getter() const { //온도 표시
if (mode)
cout << "모드: 섭씨, 온도: " << currentTemp << "C" << endl;
else
cout << "모드: 화씨, 온도: " << (currentTemp * 9 / 5) + 32 << "F" << endl;
}
};
int main() {
Thermometer T1;
int temp;
int num;
cout << "섭씨 온도 입력(-100 ~ 100): ";
cin >> temp;
cout << "표시 모드 선택 1)섭씨C 2)화씨F: ";
cin >> num;
T1.setter(temp);
if (num == 2)
T1.modeSwitch();
T1.getter();
return 0;
}
//아 getter에서 값을 리턴해야하는데... 실수로 프린트 해버렸다.

- 도전X도전 실습 (1-5)
#include <iostream>
using namespace std;
class Pilot {
private:
string name;
int licenseID;
public:
Pilot(string name, int id):name(name),licenseID(id){}
void printPilotInfo() const {
cout << "이름: " << name << ", 면허: " << licenseID << endl;
}
};
class Aircraft {
private:
string modelName;
Pilot crew[2];
public:
Aircraft(string name, const Pilot& captain, const Pilot& copilot):modelName(name),crew{captain,copilot}{}
void displayAircraftInfo() const {
cout << "비행기 모델명: " << modelName << endl;
}
void displayCrewInfo() const {
cout << "캡틴 정보" << endl;
crew[0].printPilotInfo();
cout << "코파일럿 정보" << endl;
crew[1].printPilotInfo();
}
};
int main() {
Pilot cap("Kim", 153324);
Pilot cop("Lee", 452323);
Aircraft plane("Boeing777", cap, cop);
plane.displayAircraftInfo();
plane.displayCrewInfo();
return 0;
}

- 1주차 숙제
#include <iostream>
using namespace std;
// TODO: Phone 클래스 구현
// - displayBrand()와 showFeature() 순수 가상 함수를 포함하도록 구현하세요
// - 소멸자를 반드시 virtual로 선언하세요
class Phone {
public:
virtual void displayBrand() = 0;
virtual void showFeature() = 0;
virtual ~Phone(){} //소멸자
};
// Samsung 클래스 작성 (Phone 클래스를 상속받음)
class Samsung : public Phone {
public:
void displayBrand() {
cout << "Samsung" << endl;
}
void showFeature() {
cout << "Galaxy S 시리즈" << endl;
}
};
// pple 클래스 작성 (Phone 클래스를 상속받음)
class Apple : public Phone {
public:
void displayBrand() {
cout << "Apple" << endl;
}
void showFeature() {
cout << "iPhone Pro 시리즈" << endl;
}
};
// Xiaomi 클래스 작성 (Phone 클래스를 상속받음)
class Xiaomi : public Phone {
public:
void displayBrand() {
cout << "Xiaomi" << endl;
}
void showFeature() {
cout << "Redmi Note 시리즈" << endl;
}
};
int main() {
// TODO: main 함수 구현
// - Phone* 타입의 배열을 생성하여 Samsung, Apple, Xiaomi 객체를 저장
// - 반복문을 사용하여 각 객체의 displayBrand()와 showFeature()를 호출
// - 반복문을 사용하여 메모리 해제를 위해 delete 호출
Phone* phones[3];
phones[0] = new Samsung(); //new 동적 메모리 할당
phones[1] = new Apple();
phones[2] = new Xiaomi();
for (int i = 0; i < 3; i++) {
phones[i]->displayBrand();
phones[i]->showFeature();
}
for (int i = 0; i < 3; i++) {
delete phones[i]; //delete 동적 메모리 할당 해제
}
return 0;
}
3. 참고
[C/C++ 프로그래밍 : 중급] 3. 생성자와 소멸자
Chapter 3. 생성자와 소멸자 객체의 생명주기에 필수적인 이 두 기능을 이해하면, 메모리 관리를 효과적으로 할 수 있습니다. 즉, 이는 안정성과 성능을 위해 필수적인 개념입니다. 이 장에서는 생
gdngy.tistory.com
클래스를 오랜만에 작성하다보니 어색하고 서툴렀는데 그래도 문제와 실습으로 여러번 작성하니 점차 익숙해지는 것 같다.👍👍
'내배캠Unreal_TIL > C++' 카테고리의 다른 글
| [TIL] 2025-12-12 | 과제1 구현 및 입력 실패 처리, C++ 힙메모리 (0) | 2025.12.12 |
|---|---|
| [C++] Google C++ Style Guide, 구글 코드 컨벤션 (1) | 2025.12.11 |
| [TIL] 2025-12-10 | C++ 포인터와 레퍼런스, 클래스와 생성자 익히기, 멤버 초기화 리스트 (0) | 2025.12.10 |
| [TIL] 2025-12-09 | C++ 난수 생성, string 클래스와 getline(), 화면 초기화 (0) | 2025.12.09 |
| [TIL] 2025-12-08 | C++ 가변 인자 (0) | 2025.12.08 |