프로그래밍 언어/C++

C++ 정적 바인딩과 동적 바인딩의 차이점

ShovelingLife 2022. 8. 21. 10:58

바인딩은 일반적으로 한 항목을 다른 항목에 매핑하는 것을 나타낸다. 컴파일된 언어의 컨텍스트에서 바인딩은 함수 호출과 함수 정의 간의 연결이다. C++에서 함수가 호출되면 프로그램 컨트롤은 해당 함수가 정의된 메모리 주소에 바인딩된다.

C++에는 정적(또는 초기) 바인딩과 동적(또는 후기) 바인딩의 두 가지 유형의 바인딩이 있다. 이 게시물은 C++의 정적 바인딩과 동적 바인딩의 차이점에 대한 개요를 제공한다.

  1. 정적 바인딩은 컴파일 타임에 발생하고 동적 바인딩은 런타임에 발생한다. 따라서 각각 조기 및 후기 바인딩이라고도 한다.
  2. 정적 바인딩에서는 함수 정의와 함수 호출이 컴파일 시간에 연결되지만 동적 바인딩에서는 런타임까지 함수 호출이 해결되지 않으므로 런타임까지 바인딩되지 않는다.
  3. 정적 바인딩은 함수를 호출하는 데 필요한 모든 정보를 컴파일 타임에 사용할 수 있을 때 발생한다. 동적 바인딩은 컴파일러가 컴파일 타임에 함수 호출에 필요한 모든 정보를 결정할 수 없을 때 발생한다.
  4. 정적 바인딩은 일반 함수 호출, 함수 오버로딩 및 연산자 오버로딩을 사용하여 달성할 수 있지만 동적 바인딩은 가상 함수를 사용하여 달성할 수 있다.
  5. 함수를 호출하는 데 필요한 모든 정보는 런타임 전에 사용할 수 있으므로 정적 바인딩을 사용하면 프로그램을 더 빠르게 실행할 수 있다. 정적 바인딩과 달리 함수 호출은 이후 바인딩을 위해 런타임까지 확인되지 않으므로 코드 실행이 다소 느려진다.
  6. 동적 바인딩의 주요 장점은 단일 함수가 런타임에 다양한 유형의 개체를 처리할 수 있기 때문에 유연하다는 것이다. 이렇게 하면 코드베이스의 크기가 크게 줄어들고 소스 코드의 가독성도 높아진다.

정적 바인딩

다음 코드를 고려하자. 여기서 sum() 함수는 두 개 및 세 개의 정수 인수를 허용하도록 오버로드 되었다. 내부에 같은 이름의 함수가 2개 있어도 ComputeSum 클래스, 함수 호출 sum() 해당 함수에 전달된 매개변수에 따라 올바른 함수에 바인딩한다. 이 바인딩은 컴파일 시간 동안 정적으로 수행된다.

// 정적 바인딩의 개념을 설명하는 C++ 프로그램
#include <iostream>
using namespace std;
 
class ComputeSum
{
    public:
 
    int sum(int x, int y) {
        return x + y;
    }
 
    int sum(int x, int y, int z) {
        return x + y + z;
    }
};
 
int main()
{
    ComputeSum obj;
    cout << "Sum is " << obj.sum(10, 20) << endl;
    cout << "Sum is " << obj.sum(10, 20, 30) << endl;
 
    return 0;
}
결과:

Sum is 30
Sum is 60

동적 바인딩

기본 클래스가 있는 다음 코드를 고려하자. B및 파생 클래스 D. 기본 클래스 B 가상 기능이 있다 f(), 파생 클래스의 함수에 의해 재정의됨 D, 즉, D::f() 재정의 B::f(). 이제 어떤 클래스의 함수가 호출될 것인지에 대한 결정이 다음이 가리키는 객체의 동적 유형에 따라 달라지는 30-34행을 고려하자. basePtr. 이 정보는 런타임에만 사용할 수 있으므로 f() 동적 바인딩이 적용 된다.

// 동적 바인딩의 개념을 설명하는 C++ 프로그램
#include <iostream>
using namespace std;
 
class B
{
    public:
 
    // 가상 함수
    virtual void f() {
        cout << "The base class function is called.\n";
    }
};
 
class D: public B
{
    public:
    void f() {
        cout << "The derived class function is called.\n";
    }
};
 
int main()
{
    B base;
    D derived;
 
    B *basePtr = &base;
    basePtr->f();
 
    basePtr = &derived;
    basePtr->f();
 
    return 0;
}
결과:

The base class function is called.
The derived class function is called.

출처 : https://www.techiedelight.com/ko/difference-between-static-dynamic-binding-cpp/