728x90

앞서 Virtual Function과 Virtual Table 그리고 Polymophism에 대해서 공부를 하였다. 이번에는 Pure Virtual Function (순수 가상 함수)에 대해서 공부한다. 

 

Pure Virtual Function (순수 가상 함수)


순수 가상 함수는 엄청 쉽다. 기존 Virtual Function에서 definition을 해주지 않고 값을 0으로 해주면 그것에 Pure Virtual Function이 된다. 또한 순수 가상 함수가 존재하는 클래스는 Abstract Class라고 부른다. 

 

아래 코드는 간단한 Pure Virtual Function을 만든 예이다. 

class Human
{
public:
    virtual void walk() const = 0;
private:
    int age;
};

사람을 클래스로 만든다고 가정을 하면 사람의 공통적인 특징인 걷기가 있을 것이다. walk() 멤버 함수를 virtual로 선언한 뒤 0으로 초기화를 해주어 Pure Virtual Function을 만들었다. 

 

walk() 멤버 함수를 0으로 초기화를 하면 해당 Human클래스의 객체 생성이 불가능하다. 쉽게 생각하면 Human의 객체는 walk() 멤버 함수를 호출할 방법이 없기 때문이다. 결론적으로 Class 내부에 Pure Virtual Function이 1개라도 존재한다면 해당 클래스의 객체 생성이 불가능하다. 이는 클래스가 Abstract Class가 된다는 의미이다.  

 

 

Pure Virtual Function의 상속 관계

 

Pure Virtual Function도 Virtual Function이기 때문에 상속받은 클래스에서의 재정의를 기대한다. 결국 Pure Virtual Function이 존재하는 Abstract Class를 상속받은 Class에서 해당 Pure Virtual Function을 재정의 하지 않으면 상속받은 Derived Class도 객체 생성이 불가능해진다. 결국 Derived Class를 객체 생성을 하기 위해서는 Pure Virtual Function에 대한 재정의가 반드시 이루어져야 한다. 

#include <iostream>

class Human
{
public:
    virtual void walk() const = 0;
private:
    int age;
};

class Asian
{
public:
	virtual void walk() const
    {
        std::cout << "Walking..." << std::endl;
    }
private:
    int intelligence;
}

int main()
{
    Human Human1; //Abstract Class객체 생성 불가.
    Asian gildong; //Pure Virtual Function가 재정의 되어 객체 생성 가능
    
    return 0;
}

Asian 클래스에서 Pure Virtual Function에 대한 재정의가 이루어졌기 때문에 해당 객체를 선언이 가능하다. 

 

 

Pure Virtual Function을 사용하는 이유?

 

Pure Virtual Function을 사용하는 이유는 Interface라는 개념을 사용하기 위함이다.

 

Interface

 

Interface란 Abstract Class를 의미하지만 specific 하게 멤버 변수와 Pure Virtual Function만 존재하는 Abstract Class를 의미한다. 

Interface를 사용하는 이유는 쉽게 생각하면 "틀 제공"과 같다. 위에서 구성한 클래스를 보게 되면 Human이라는 interface를 생성하였다. walk() 멤버 함수만 구현하였지만 Human 즉 사람이 가지고 있는 공통적인 특성들이 있을 것이다. 예를 들면 잠을 자는 것, 감정이 있는 것 등등. 결국 Interface가 궁극적으로 해주는 역할은 어떤 대상의 전체적인 틀을 명시해주고 Derivde클래스에서 해당 특징들에 대한 자세한 내용을 기술하여 사용하기 위함이다. 

 

개인적으로 게임의 몬스터를 만든다고 생각을 하면 이해하기 쉬웠다. 핵심은 전체적인 틀을 제공하여 세부사항은 상속받은 클래스에서 재정의하기를 기대하는 것이다. 

+ Recent posts