C++

정적 바인딩 vs 동적 바인딩

yoosorang 2025. 2. 9. 14:00

✔정적 바인딩

프로그램 컴파일 시점에 함수 호출이 결정되는 바인딩으로 일반 함수에 해당(non-virtual)

빠르고 메모리 사용이 적음

 

✔동적 바인딩

프로그램 실행 시점에 함수 호출이 결정되는 바인딩으로 가상 함수(virtual function_virtual 키워드) 사용

실행 중에 객체의 실제 타입에 따라 적합한 함수 호출

 

//파생 클래스에서 기본 클래스의 함수를 재정의했더라도, 
//포인터나 참조가 기본 클래스 형식인 경우 기본 클래스의 함수가 호출
#include <iostream>
using namespace std;

class Base {
public:
    virtual void Print() { // 동적 바인딩
        cout << "Base Print" << endl;
    }
    void NonVirtualPrint() { // 정적 바인딩
        cout << "Base NonVirtualPrint" << endl;
    }
};

class Derived : public Base {
public:
    void Print() override { // 동적 바인딩
        cout << "Derived Print" << endl;
    }
    void NonVirtualPrint() { // 정적 바인딩
        cout << "Derived NonVirtualPrint" << endl;
    }
};

int main() {
    Base* basePtr = new Derived();

    // 동적 바인딩 (virtual)
    basePtr->Print(); // Derived Print

    // 정적 바인딩 (non-virtual)
    basePtr->NonVirtualPrint(); // Base NonVirtualPrint

    delete basePtr;
    return 0;
}

💡Plus

  • 가상함수는 가상 함수 테이블이라는 구조를 사용하여 호출 대상이 실행 시점에 결정됨
  • 가상 함수가 있는 클래스에서 소멸자는 반드시 virtual로 선언해야 메모리 누수 방지 가능
#include <iostream>
using namespace std;

class Base {
public:
    virtual void Print() { // 가상 함수
        cout << "Base Print" << endl;
    }
    virtual ~Base() {} // 가상 소멸자
};​