프로그래밍 언어/C++
가상 함수와 순수 가상 함수의 차이점 정리
로안님
2025. 1. 24. 20:44
C++에서 **가상 함수(Virtual Function)**와 **순수 가상 함수(Pure Virtual Function)**는 객체지향 프로그래밍에서 중요한 다형성(Polymorphism)을 구현하는 도구입니다. 이 글에서는 가상 함수와 순수 가상 함수의 차이점을 정리하고, 각각의 특징과 사용 예제를 살펴보겠습니다.
가상 함수 (Virtual Function)
개념
가상 함수는 기본 클래스에서 선언되며, **기본 구현(디폴트 동작)**이 포함되어 있습니다.
자식 클래스에서 해당 함수를 재정의(Override)하면, 기본 클래스 포인터나 참조를 통해 호출해도 재정의된 자식 클래스 함수가 호출됩니다.
특징
- 기본 클래스에서 구현이 포함되어 있음.
- **재정의(Override)**는 선택 사항.
- 자식 클래스가 재정의하지 않으면 기본 클래스의 구현이 호출됩니다.
- 런타임 시점에 실제 객체의 타입을 확인하여 적절한 함수를 호출하는 **다형성(Polymorphism)**을 지원합니다.
예제: 가상 함수
#include <iostream>
using namespace std;
class Base {
public:
virtual void Display() {
cout << "Base class Display" << endl; // 디폴트 구현
}
};
class Derived : public Base {
public:
void Display() override { // 재정의된 동작
cout << "Derived class Display" << endl;
}
};
int main() {
Base* obj = new Derived(); // 기본 클래스 포인터로 자식 객체 참조
obj->Display(); // Derived class Display 출력 (자식 클래스 함수 호출)
delete obj;
return 0;
}
순수 가상 함수 (Pure Virtual Function)
개념
순수 가상 함수는 기본 클래스에서 선언만 되고, 구현이 없는 함수입니다.
자식 클래스는 반드시 이 함수를 재정의해야 하며, 기본 클래스는 추상 클래스(Abstract Class)로 간주됩니다.
특징
- 기본 클래스에서 구현이 없음: = 0으로 표시.
- 자식 클래스에서 반드시 재정의해야 함.
- 순수 가상 함수가 포함된 클래스는 **추상 클래스(Abstract Class)**가 되며, 인스턴스를 생성할 수 없습니다.
예제: 순수 가상 함수
#include <iostream>
using namespace std;
class AbstractBase {
public:
virtual void Display() = 0; // 순수 가상 함수
};
class Derived : public AbstractBase {
public:
void Display() override { // 반드시 재정의
cout << "Derived class Display" << endl;
}
};
int main() {
// AbstractBase obj; // 오류! 추상 클래스는 인스턴스화할 수 없음
AbstractBase* obj = new Derived(); // 포인터로는 가능
obj->Display(); // Derived class Display 출력
delete obj;
return 0;
}
가상 함수와 순수 가상 함수의 차이
특징가상 함수순수 가상 함수
기본 구현 | 기본 클래스에서 구현이 존재할 수 있음. | 구현이 없음. = 0으로 표시. |
재정의 필요성 | 자식 클래스에서 재정의는 선택 사항. | 자식 클래스에서 반드시 재정의해야 함. |
추상 클래스 여부 | 가상 함수만 있는 경우 추상 클래스가 아님. | 순수 가상 함수가 있으면 추상 클래스가 됨. |
인스턴스 생성 가능 여부 | 기본 클래스에서 인스턴스 생성 가능. | 추상 클래스이므로 인스턴스 생성 불가. |
게임 개발에서의 활용
가상 함수
가상 함수는 게임 개발에서 기본 동작 제공 + 필요 시 확장하는 구조를 설계할 때 유용합니다.
예: 캐릭터 클래스
class Character {
public:
virtual void Attack() {
cout << "Basic attack!" << endl;
}
};
class Warrior : public Character {
public:
void Attack() override {
cout << "Warrior swings a sword!" << endl;
}
};
class Mage : public Character {
public:
void Attack() override {
cout << "Mage casts a fireball!" << endl;
}
};
순수 가상 함수
순수 가상 함수는 공통 인터페이스 설계에 사용됩니다.
기본 클래스를 추상 클래스로 만들어 강제적으로 자식 클래스에서 구현하도록 요구합니다.
예: 무기 인터페이스
class Weapon {
public:
virtual void Use() = 0; // 순수 가상 함수
};
class Sword : public Weapon {
public:
void Use() override {
cout << "Swinging a sword!" << endl;
}
};
class Bow : public Weapon {
public:
void Use() override {
cout << "Shooting an arrow!" << endl;
}
};
마무리
요약
- 가상 함수는 기본 구현을 제공하며, 필요할 때 재정의할 수 있습니다.
- 순수 가상 함수는 기본 클래스에 구현이 없으며, 자식 클래스가 반드시 재정의해야 합니다.
- 게임 개발에서는 가상 함수로 기본 동작을 확장하거나, 순수 가상 함수로 공통 인터페이스를 설계하는 등 다양한 용도로 활용됩니다.