바인딩은 일반적으로 한 항목을 다른 항목에 매핑하는 것을 나타낸다. 컴파일된 언어의 컨텍스트에서 바인딩은 함수 호출과 함수 정의 간의 연결이다. C++에서 함수가 호출되면 프로그램 컨트롤은 해당 함수가 정의된 메모리 주소에 바인딩된다.
C++에는 정적(또는 초기) 바인딩과 동적(또는 후기) 바인딩의 두 가지 유형의 바인딩이 있다. 이 게시물은 C++의 정적 바인딩과 동적 바인딩의 차이점에 대한 개요를 제공한다.
- 정적 바인딩은 컴파일 타임에 발생하고 동적 바인딩은 런타임에 발생한다. 따라서 각각 조기 및 후기 바인딩이라고도 한다.
- 정적 바인딩에서는 함수 정의와 함수 호출이 컴파일 시간에 연결되지만 동적 바인딩에서는 런타임까지 함수 호출이 해결되지 않으므로 런타임까지 바인딩되지 않는다.
- 정적 바인딩은 함수를 호출하는 데 필요한 모든 정보를 컴파일 타임에 사용할 수 있을 때 발생한다. 동적 바인딩은 컴파일러가 컴파일 타임에 함수 호출에 필요한 모든 정보를 결정할 수 없을 때 발생한다.
- 정적 바인딩은 일반 함수 호출, 함수 오버로딩 및 연산자 오버로딩을 사용하여 달성할 수 있지만 동적 바인딩은 가상 함수를 사용하여 달성할 수 있다.
- 함수를 호출하는 데 필요한 모든 정보는 런타임 전에 사용할 수 있으므로 정적 바인딩을 사용하면 프로그램을 더 빠르게 실행할 수 있다. 정적 바인딩과 달리 함수 호출은 이후 바인딩을 위해 런타임까지 확인되지 않으므로 코드 실행이 다소 느려진다.
- 동적 바인딩의 주요 장점은 단일 함수가 런타임에 다양한 유형의 개체를 처리할 수 있기 때문에 유연하다는 것이다. 이렇게 하면 코드베이스의 크기가 크게 줄어들고 소스 코드의 가독성도 높아진다.
정적 바인딩
다음 코드를 고려하자. 여기서 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/
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 간단하게 사용할 수 있는 포인터 해제 매크로 함수 (0) | 2022.08.29 |
---|---|
C++ 포인터 객체 자살 (delete this) (0) | 2022.08.24 |
C++ 중괄호 초기화 (0) | 2022.08.19 |
C++ 비동기 (Asynchronous) 실행 (0) | 2022.08.17 |
C++ 동기(synchronous)와 비동기(asynchronous) / 블로킹(blocking)과 논블로킹(non-blocking) (0) | 2022.08.16 |