본문 바로가기
IT/c++

C++ 가상함수: 동적 다형성의 핵심

by 뉴코딩맨 2023. 8. 6.
C++에서 가상함수는 객체지향 프로그래밍의 핵심 개념 중 하나로, 다른 클래스에서 오버라이드할 수 있는 함수를 말합니다. 가상함수를 사용하면 런타임에 동적으로 함수 호출을 결정할 수 있어, 다형성과 유연성을 높일 수 있습니다. 이 글에서는 C++의 가상함수 개념, 사용 이유, 정의 방법, 동작 원리 및 예제를 소개합니다.

 

 

가상함수란 무엇인가?

가상함수는 기반 클래스에서 선언되고 파생 클래스에서 오버라이드될 수 있는 함수입니다. 이 함수들은 런타임에 객체의 실제 타입을 기반으로 호출됩니다. 이로써 서로 다른 클래스의 객체가 같은 인터페이스를 가지고 다른 동작을 수행할 수 있게 됩니다.
 

가상함수의 사용 이유

가상함수는 상속 관계에서 다형성을 가능하게 합니다. 기반 클래스의 포인터나 참조를 사용하여 파생 클래스의 함수를 호출하면, 실제 객체의 타입에 따라 올바른 함수가 호출됩니다. 이를 통해 유연하고 확장 가능한 코드를 작성할 수 있습니다.
 

가상함수 정의 방법

가상함수를 정의하려면 함수의 선언 앞에 virtual 키워드를 붙입니다. 이로써 컴파일러는 런타임에 함수를 동적으로 선택하게 됩니다.
 
class Shape {
public:
    virtual void draw() {
        // 기본 구현
    }
};
 

가상함수의 동작 원리

가상함수의 동작 원리는 가상 함수 테이블(VTable)에 기반합니다. 각 클래스는 가상 함수들에 대한 포인터를 담은 VTable을 가지며, 객체마다 해당 클래스의 VTable에 대한 포인터(vptr)가 추가됩니다. 런타임에 올바른 함수를 호출하기 위해 vptr을 통해 VTable을 참조합니다.
 

가상함수를 이용한 동적 다형성

가상함수는 동적 다형성을 구현하는 핵심입니다. 기반 클래스의 포인터나 참조를 통해 파생 클래스의 가상함수를 호출하면, 실제 객체의 타입에 맞춰서 호출됩니다. 이를 통해 각 객체는 자신의 타입에 맞는 동작을 수행할 수 있습니다.
 
 

예제를 통한 설명

다음은 도형을 나타내는 기반 클래스 Shape와 이를 상속받은 파생 클래스 Circle의 예제입니다.
 
class Shape {
public:
    virtual void draw() {
        cout << "기본 도형을 그립니다." << endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        cout << "원을 그립니다." << endl;
    }
};

 

위 코드에서 Circle 클래스가 Shape 클래스의 가상함수 draw()를 오버라이드하여 동적 다형성을 구현합니다. 이제 기반 클래스 포인터로 Circle 객체를 가리키고 draw()를 호출하면, 실제 객체의 타입에 따라 올바른 함수가 호출됩니다.
 

결론

C++의 가상함수는 다형성을 구현하는 강력한 도구로, 객체지향 프로그래밍에서 유연하고 확장 가능한 코드를 작성하는 데 도움을 줍니다. 기반 클래스와 파생 클래스 간의 관계를 통해 동일한 인터페이스로 다양한 동작을 수행할 수 있게 되며, 이를 통해 프로그램의 유지보수성과 가독성을 향상시킬 수 있습니다.

 

 

C++ 오버라이딩(overriding)

오버라이딩(Overriding)은 객체 지향 프로그래밍에서 사용되는 중요한 개념 중 하나입니다. 이는 부모 클래스의 멤버 함수를 자식 클래스에서 동일한 이름과 파라미터로 다시 정의하는 것을 의미

newcodingman.tistory.com

 

댓글