2016년 3월 7일 월요일

[c++] 정적/동적 바인딩


 이번에는 정적 바인딩(Static Binding) 동적 바인딩 (Dynamic Binding)이 무엇인지 알아 보기 전에 바인딩(Binding)이란 무엇인지 알아 보자. 
바인딩이란 프로그램 소스에 쓰인 각종 내부 요소, 이름, 식별자들에 대해 값 혹은 속성을 확정하는 과정
이 과정이 빌드 중에 이루어지면 정적 바인딩이라고 하고, 
실행 중에 이루어지면 동적 바인딩이라고 한다. 

 그럼 한번 예를 들어 보자 아래와 같이 A,B,C가 상속관계에 있고 abc라는 함수가 virtual로 선언되어 있다고 하자. 
 만약 메인 함수에서 다음과 같이 코딩을 했다고 해보자.
  1. void main()  
  2. {  
  3.     A* a = new [ 어떤것 ] //[] 안에 들어갈것이 무엇인지는 모른다.  
  4.     a->abc();  
  5. }  
 객체 포인터 선언에 '어떤것'이 무엇인지 알아야 어떤것이 호출되는지 알수 있다. 포인터에 따라서 호출되는 함수가 결정되는 것이 아니라, 그 포인터가 가리키는 객체에 따라서 호출되는 함수가 결정된다는 것이 바로 동적 바인딩(Dynamic Binding)이다. 즉, 실제로 대상에 따라서 호출되는 함수가 상황에 따라 달라지는 것을 의미한다. 
 그럼 정적바인딩이란 무엇인가 ? 다음과 같은 선언이 있다고 해보자. 
  1. void main()  
  2. {  
  3.     int static_binding =2  
  4. }  
 이 선언 부분에서 데이터 타입이 int로 정해지는 것과 그 타입의 변수명이 static_binding으로 정해지는 것이 바로 정적 바인딩(Static Binding) 이다. 

 C++의 가상 함수의 바인딩은 문서상으로는 동적 바인딩으로 되어 있으나, 구현상으로는 런타임 성능을 높이기 위해 정적 바인딩을 쓰고 있다. 즉, 컴파일중에 아예 가상 함수 테이블을 파생 클래스에 맞게 바꿈으로써, 겉보기에는 파생 클래스 타입에서 오버라이드한 가상 함수를 호출하는 것처럼 보이게 만드는 것이다. 

댓글 없음:

댓글 쓰기

[Effective C++] 항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자.

인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별 최적화를 걸기가 용이해집니다. 인라인 함수의 아이디어는  함수 호출문을 그 함수의 본문으로 바꿔치기하자는 것  남발했다가는 코드의 크기가 커질 게 뻔하다. 인라인 함수로 부풀려진 ...