Qaupot Blog
Software Engineering, Trip

407. 순수 가상 함수 / 추상 클래스

🕐 Mon, 17 Mar 2014 09:00:00 GMT

순수 가상 함수(Pure Virtual Function)

순수 가상함수는 구현이 없는 가상함수를 말합니다.


class Person
{
public:
    virtual void VirtualMethod() = 0;
};

구현 대신 가상함수에 NULL (0)값을 대입하면 해당 함수는 순수 가상함수가 됩니다. 이와 동시에 순수 가상함수를 포함하는 클래스는 추상 클래스(Abstract Class)로 지정됩니다.

추상 클래스 (Abstract Class)

추상 클래스가 되면 인스턴스를 만들 수 없습니다. 이 클래스로부터 다른 자식 클래스를 파생시켜서 모든 순수 멤버 가상함수를 오버라이드 한 뒤, 해당 자식 클래스부터 인스턴스를 다시 생성할 수 있습니다.

즉, 추상 클래스는 '추상적인 형태'만 제안하고, 실제 구현은 자식 클래스로 미루기 위해 사용됩니다.


class Person
{
public:
    void DoAction()
    {
        std::cout << "Good Morning!" << std::endl;
        Action();
        std::cout << "Sleep.." << std::endl;
    }
private:
    virtual void Action() = 0;
};

class Student : public Person
{
private:
    virtual void Action()
    {
        std::cout << "Study" << std::endl;
    }
};

class Employee : public Person
{
private:
    virtual void Action()
    {
        std::cout << "Work" << std::endl;
    }
};

int main(int argc, char** argv)
{
    Student student;
    Employee employee;

    student.DoAction();
    std::cout << std::endl;
    employee.DoAction();
}

Good Morning!
Study
Sleep..

Good Morning!
Work
Sleep..

위의 예제에서 Person은 Action이라는 순수 가상함수를 포함하는 추상클래스입니다. 멤버 함수인 DoAction은 일어나서 Action을 하고 잠에 든다로 동작을 확정했습니다. 즉, "어떠한 Action을 할 것인가"에 대한 문제는 자식으로 미뤄놓은 상태입니다.

이를 쉽게 비유하면, 큰 명제에 몇개의 괄호를 비워놓은 것이라고 할 수 있습니다. 학생은 일어나서 [공부]를 하고 잠에 든다. 직원은 일어나서 [일]을 하고 잠에 든다.

큰 흐름은 부모 혹은 클래스 외부에 미리 설계되어 있는대로 따라가지만, 세부적인 사항은 자식 클래스에 위임하는 것입니다.

또한, 오직 추상적 설계만을 위해 디자인 된 모든 멤버 함수가 순수 가상함수인 클래스를 인터페이스(Interface)라고 부르기도 합니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.