[TIL] 2025-12-11 | C++ 객체지향 프로그래밍, 상속과 다형성

2025. 12. 11. 17:27·내배캠Unreal_TIL/C++
게임 개발자를 위한 C++ 문법 1-6, 7

13명 소파 멘토링

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. 참고

https://gdngy.tistory.com/175

 

[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
'내배캠Unreal_TIL/C++' 카테고리의 다른 글
  • [TIL] 2025-12-12 | 과제1 구현 및 입력 실패 처리, C++ 힙메모리
  • [C++] Google C++ Style Guide, 구글 코드 컨벤션
  • [TIL] 2025-12-10 | C++ 포인터와 레퍼런스, 클래스와 생성자 익히기, 멤버 초기화 리스트
  • [TIL] 2025-12-09 | C++ 난수 생성, string 클래스와 getline(), 화면 초기화
윤윤씨
윤윤씨
🎮 내일배움캠프 Unreal 7기
  • 윤윤씨
    컴퓨터온열맛사지
    윤윤씨
  • 전체
    오늘
    어제
    • 분류 전체보기 (62)
      • 내배캠Unreal_TIL (62)
        • C++ (23)
        • UE (31)
        • 팀프로젝트 (7)
      • etc (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
    • Solved.ac
    • YouTube
  • 태그

    디자인패턴
    언리얼과제
    오토마타
    STL
    프로그래머스
    ta
    챌린지
    코드카타
    스테이트머신
    gas
    머티리얼
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.6
윤윤씨
[TIL] 2025-12-11 | C++ 객체지향 프로그래밍, 상속과 다형성
상단으로

티스토리툴바