바인딩

  • 함수 호출을 해당 함수의 정의와 결합하는 것을 말한다.  
  • 즉 어떠한 크래스의 객체로 해당 클래스의 멤버함수를 호출하고자 할때 멤버함수와 객체는 결합하여 호출을 하는데, 이떄를 바인딩 된다 라고 하는 것이다.  
  • 함수를 만들어 컴파일을 하면 각각의 코드가 메모리 어딘가에 저장된다.  
  • 그리고 함수를 호출하는 부분에는 그 함수가 저장된 메모리 번지수(주소값)이 저장된다.  

프로그램 실행 → 함수 호출 → 함수가 저장된 주소로 점프 → 함수 실행 → 원래 위치


위 과정에서 함수를 호출하는 부분에 함수가 위치한 메모리 번지로 연결시켜 주는 것을 바인딩(Binding) 이라고 한다.  
바인딩이란 프로그램 소스에 쓰인 각종 내부 요소, 이름, 식별자들에 대해 값 혹은 송석을 확정하는 과정을 말한다. 
빌드 중에 이루어지면, 정적바인딩, 실행 중 이루어지면 정적바인딩 이라고 한다  

함수를 바인딩하는 2가지 방법  


(1) 정적 바인딩 (일반 함수)  

* 컴파일 시간에 호출될 함수로 점프할 주소가 결정되어 바인딩 되는 것.
* 컴파일 시간에 호출될 함수를 미리 정해두는 방법
* 빌드 중에 이루어진다.  

void main()
{
 int iValue = 2;
}


(2) 동적 바인딩 (가상 함수)  

* 실행 파일을 만들 때 바인딩 되지 않고 보류 상태 둔다.
* 실행 시간에 실제로 사용된 객체의 클래스형에 의해 호출될 함수가 결정됩니다.  
* 포인터가 내용이 없다가, 값을 받고 내용일 생겻을떄
* 점프할 메모리 번지를 저장하기 위한 메모리 공간(4 byte)을 가지고 있다가 런타임에 결정.

void main() 
{ 
 A* a = new [어떤것] 
 a->abc(); 
} 


* 단점 : 타입 체킹으로 인한 수행 속도 저하 / 메모리 공간 낭비 => 가급적 정적 바인딩 사용

위 2 가지의 단점이 있음에도 불구하고 동적 바인딩을 하는 이유

   
* 어떤 포인터에 의해 접근되었는 지에 상관없이 참조된 인스턴스의 실제 클래스형에 따라 재정의된 함수 호출이 가능  


 

+ Recent posts