[c++] 가상 함수와 동적 바인딩(dynamic binding)의 관계

C++에서 “가상 함수”는 상속된 클래스에서 다형성(polymorphism)을 지원하기 위해 사용됩니다. “동적 바인딩”은 이러한 다형성(polymorphism)을 가능하게 하는 메커니즘입니다. 이 블로그 포스트에서는 C++에서 가상 함수와 동적 바인딩의 관계에 대해 살펴보겠습니다.

가상 함수(Virtual Functions)

가상 함수는 기본 클래스(base class)에서 파생 클래스(derived class)에서 재정의(override)될 수 있는 함수입니다. 파생 클래스에서 동일한 이름과 시그니처(signature)를 가진 함수를 재정의하면, 해당 함수를 가상 함수로 선언합니다. 이것은 가상 함수가 런타임에 객체의 실제 타입(type)을 기반으로 호출되도록 하는데 도움이 됩니다.

class Base {
public:
    virtual void show() {
        cout << "Base class\n";
    }
};

class Derived : public Base {
public:
    void show() override {
        cout << "Derived class\n";
    }
};

위의 코드에서 show 함수는 Base 클래스와 Derived 클래스에서 모두 재정의되었고, virtual 키워드로 선언되었습니다. 이것이 바로 가상 함수의 개념입니다.

동적 바인딩(Dynamic Binding)

C++에서는 객체의 포인터 또는 참조를 통해 가상 함수를 호출할 때, 실제 객체의 타입에 맞는 함수가 런타임에 동적으로 결정됩니다. 이를 “동적 바인딩” 또는 “늦은 바인딩”이라고 합니다. 이것은 다형성(polymorphism)을 가능하게 하며, 객체가 어떤 타입으로 정확히 동작할지를 런타임에 결정할 수 있게 합니다.

Base* basePtr = new Derived();
basePtr->show();  // "Derived class"를 출력

위의 코드에서 basePtr은 Base 클래스의 포인터이지만 런타임에 실제 객체 타입이 Derived 클래스이므로 Derived 클래스에 있는 show 함수가 호출됩니다.

결론

가상 함수와 동적 바인딩은 C++에서 다형성을 구현하는 데 중요한 역할을 합니다. 가상 함수를 사용하여 파생 클래스에서 함수를 재정의하고, 동적 바인딩을 통해 런타임에 올바른 함수를 호출할 수 있습니다. 이를 통해 유연하고 확장 가능한 코드를 작성할 수 있게 됩니다.

이러한 기능은 객체지향 프로그래밍의 핵심 원리 중 하나이며, C++에서 강력한 기능을 제공하는데 중요한 기능입니다.

참고 자료: [https://www.learncpp.com/cpp-tutorial/126-classes-and-class-members-virtual-functions/]