동적 바인딩(Late Binding), 정적바인딩(Early Binding)

Naezan·2024년 4월 16일

C++

목록 보기
1/5

바인딩(Binding)

바인딩이란 특정한 값이나 객체가 다른 값이나 객체와 연결되어 있는 상태를 뜻합니다.

int x = 10 

간단한 예시로 위 식에서 x는 10에 바인딩(연결) 되었다고 표현합니다.

컴파일 과정 속 구문분석

Late BindingEarly Binding에 대해서 설명하기에 앞서 컴파일러가 어떻게 함수의 바인딩을 처리해주는지에 대해 알아야합니다.

컴파일러는 코드로 작성된 텍스트파일을 받아서 구문분석, 구문 의미분석 등을 수행 후 중간언어 혹은 기계언어의 코드로 변환해줍니다.

C++ 의 경우 전처리과정을 통해 .i 또는 .ii 중간파일로 저장되고 전처리된 파일은 컴파일을 통해 다시 어셈블리로 그리고 .obj, .o의 확장자를 가진 중간언어로 변환됩니다.

마지막으로 링킹과정에서 오브젝트파일과 라이브러리 파일이 결합되어 .exe의 실행파일이 생성됩니다.

구문분석 속 바인딩

구문 분석(Syntactic analysis)의 경우 프로그램의 주석, 식별자, 연산자 등의 구조를 결정하고 다음으로 클래스, 함수, 식 등의 경계를 결정합니다.
그 다음으로 의미 분석(Semantic analysis)에서는 구문 분석의 결과를 가져와서 구문의 요소와 의미를 연결합니다.

class X {}
class B {}
class D : public B
{
  public void X() { }
  public void Y() { X(); }
}

예를 들면 위 코드에서 구문 분석과정은 D의 X함수가 클래스 X의 유형이 아니라 클래스 D가 가진 X()함수 라는 것을 결정합니다.
이것을 가장 대표적인 Binding이라고 부르고 Binding은 이러한 함수의 이름을 논리적인 구조에 따라 연결짓는 것을 뜻합니다.

즉 일반적으로 바인딩은 구문과 논리적인 요소를 연결하는 것을 의미한다고 할 수 있습니다.

Early Binding, Late Binding

초기 바인딩과 후기 바인딩은 간단히 말하면 컴파일러에 의해 수행되는 바인딩과 런타임에 의해 수행되는 바인딩으로 해석할 수 있습니다.

초기 바인딩은 정적 바인딩(컴파일러에 의해서 분석된 정적요소를 사용하여 수행하는 바인딩)을 의미하고 후기 바인딩은 동적 바인딩(런타임에서 동적요소를 사용하여 수행하는 바인딩)을 의미합니다.

어떤 바인딩이 더 좋을까?

정답은 상황에 따라 달라집니다. 정적 바인딩은 런타임에서 실패하지 않는다는 장점을 가지지만 반면에 런타임에서 해당타입을 변경할 수 없다는 동적 바인딩의 장점을 가지지 못합니다.

간단하게 예시를 들어봅시다.

class B
{
  public void M(double x) {}
  public void M(int x) {}
}
class C
{
  public void X(int d) { b.M(d); }

  B b;
}

위 함수에서 C의 X를 호출하면 B의 매개변수 int타입을 가진 M(int x)가 호출되는 것을 컴파일러는 알 수 있습니다. 이때 C는 정적 바인딩된 함수 M을 호출하게됩니다.

그럼 B를 아래와 같이 바꾸면 어떻게 될까요?

class B
{
  public virtual void M(double x) {}
  public virtual void M(int x) {}
}
class C
{
  public void X(int d) { b->M(d); }

  B* b;
}

컴파일 타임에서 구문분석을 통해 바인딩을 수행하긴하지만 b.M(int or double)은 이제 가상 함수로 호출되게 됩니다.

그런데 런타임에서 이 함수가 실제로 어떤 객체의 함수를 호출할지는 알 수 없습니다. B를 상속받는 다른 객체의 함수일수도 있기 때문입니다. 이때 C는 동적 바인딩된 함수를 호출하게되고 이 호출은 런타임에서 동적으로 실행됩니다.

  • virtual로 생성되는 가상함수테이블(virtual function table : 가상함수들의 주소를 가지고 있는 테이블)은 객체지향의 특징 중 하나인 다형성과 연관있는 중요한 개념 중 하나지만 여기서는 중점적으로 다루지 않습니다.

맺음말

처음에는 바인딩에 대해서 간단하게 서술하려고 했으나 들어가면 들어갈수록 컴파일러, 객체지향의 다형성, 가상함수 테이블 등 다양한 주제를 폭넓게 다루고 있어서 바인딩 뿐만 아니라 다른 내용까지 검색하고 찾아보게 되었습니다. 추가적으로 더 많은 내용들을 찾고 포스팅을 하고싶은 마음이 굴뚝같지만 이번 글은 여기까지 정리하도록 하겠습니다.

피드백은 언제나 환영입니다. 감사합니다.

참고자료

https://www.geeksforgeeks.org/compiling-a-c-program-behind-the-scenes/
https://ericlippert.com/2012/02/06/what-is-late-binding/

profile
게임 개발자

0개의 댓글