반응형
📌 요약: 다형성 | 오버라이딩 | 정적/동적 바인딩 | 가상 함수 | 확장성과 결합도
🌀 다형성 (Polymorphism)
다형성이란 객체의 속성이나 기능이 상황에 따라 다양한 형태로 동작할 수 있는 성질입니다. 대표적으로 부모 클래스의 함수를 자식 클래스에서 재정의(오버라이딩)하여 각기 다른 동작을 수행하도록 합니다.
📌 오버라이딩과 가상 함수
오버라이딩은 부모 클래스의 함수를 자식 클래스에서 같은 이름과 매개변수로 재정의하는 기능입니다.
이를 가능하게 하려면 부모 클래스의 함수에 virtual 키워드를 붙여야 합니다.
🛠️ 예제 코드
Skill 클래스는 기본 동작을 제공하고, 자식 클래스(FireBall, Rush 등)는 Execute 함수를 재정의합니다.
#include <iostream>
using namespace std;
class Car {
protected:
string name;
int speed;
public:
void Move() {
cout << name << "이 " << speed << "만큼 속도로 이동합니다" << endl;
}
};
class SportsCar : public Car {
public:
SportsCar() {
name = "스포츠카";
speed = 300;
}
};
class Truck : public Car {
public:
Truck() {
name = "트럭";
speed = 100;
}
};
class Skill {
public:
virtual void Execute() {
cout << "스킬 재사용 대기시간을 진행시킴" << endl;
}
};
class FireBall : public Skill {
public:
void Execute() override {
Skill::Execute();
cout << "파이어볼 스킬을 사용함" << endl;
}
};
class Rush : public Skill {
public:
void Execute() override {
cout << "돌진 스킬을 사용함" << endl;
}
};
class Heal : public Skill {
void Execute() override {
Skill::Execute();
cout << "치유스킬을 사용함" << endl;
}
};
class RapidShot : public Skill {
public:
void Execute() override {
cout << "연속 사격 스킬을 사용함" << endl;
}
};
int main() {
Skill sValue = Skill();
Skill fValue = FireBall();
Rush rValue = Rush();
sValue.Execute();
fValue.Execute();
rValue.Execute();
Skill* sPtr = new Skill();
Skill* fPtr = new FireBall();
Skill* rPtr = new Rush();
cout << "------------------------" << endl;
sPtr->Execute();
fPtr->Execute();
rPtr->Execute();
delete sPtr;
delete fPtr;
delete rPtr;
return 0;
}
📌 정적 바인딩 vs 동적 바인딩
- 정적 바인딩: 컴파일 타임에 호출될 함수 결정 (인스턴스 자료형 기준)
- 동적 바인딩: 런타임에 호출될 함수 결정 (
virtual과 포인터 사용)
📌 다형성의 장점
- 확장성: 새로운 클래스를 추가해도 기존 코드 수정 없이 기능 확장 가능
- 결합도 감소: 부모 타입만을 참조하므로 클래스 간 의존성을 줄임
🧪 실행 순서
1. 정적 객체 sValue, fValue, rValue 생성 2. 각각의 Execute() 호출 (정적 바인딩으로 인해 부모 함수 기준 호출) 3. 동적 객체 sPtr, fPtr, rPtr 생성 4. 각 포인터를 통해 Execute() 호출 (자식 클래스의 오버라이딩 함수 실행) 5. new로 생성한 객체 delete 처리
반응형
'C++ > 기본' 카테고리의 다른 글
| [C++] 21. STL (0) | 2025.03.29 |
|---|---|
| [C++] 20. OOP - 추상 (0) | 2025.03.29 |
| [C++] 18. OOP - 상속 (0) | 2025.03.29 |
| [C++] 16. OOP(객체지향 프로그래밍) (0) | 2025.03.29 |
| [C++] 15. 클래스(3) (0) | 2025.03.29 |