프로그래밍 언어/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;
    }
};

마무리

요약

  • 가상 함수는 기본 구현을 제공하며, 필요할 때 재정의할 수 있습니다.
  • 순수 가상 함수는 기본 클래스에 구현이 없으며, 자식 클래스가 반드시 재정의해야 합니다.
  • 게임 개발에서는 가상 함수로 기본 동작을 확장하거나, 순수 가상 함수로 공통 인터페이스를 설계하는 등 다양한 용도로 활용됩니다.