본문 바로가기
C++/기본

[C++] 19. OOP - 다형성

by 위니밍 2025. 3. 29.
반응형
📌 요약: 다형성 | 오버라이딩 | 정적/동적 바인딩 | 가상 함수 | 확장성과 결합도

🌀 다형성 (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