본문 바로가기

STUDY/C++

상속과 동적,정적바인딩

* 다형성이란? 

부모 Class의 포인터로 자식객체를 가리킬 수 있다는 점과, 이런 경우에도 가상함수를 통해서              알맞은 자식 class의 함수가 된다는 점이 다형성을 지원하는 C++의 기능이다.  즉, 객체간의    

연결을 유연하게 해주는 원동력이 된다.


* 동적바인딩과 정적 바인딩 


  (1) 바인딩(Binding)이란? 프로그램 소스에 쓰인 각종 내부요소,이름 식별자들에 대해 값 또는 속성을 확정한 과정. 

    함수 주소를 찾아가는 과정이다.


  (2) 정적 바인딩(Static Binding)과 동적 바인딩(Dynamic Binding)

: 바인딩 과정이 컴파일 시점에 이루어지느나, 실행 도중 이루어지느냐에 따라 나뉩니다.


- 정적 바인딩 ? 바인딩 과정이 컴파일 시점에 이루어지는 바인딩. 

    소스상에 명시적으로 int a = 0; 과 같이 타입과 타입의 변수명을 선언하는 것을 정적 바인딩이라고 한다.

 > 장점? 컴파일시 타입에 대한 정보가 결정되어 있어서 속도가 빠르며, 안정적이다.

 > 단점? 컴파일시 결정이 되고, 그 이후 변경이 불가능하다. 


- 동적 바인딩 ? 바인딩 과정이 실행도중 이루어지는 바인딩.

   가상함수가 정의되어 있는 경우, 사용된다. 

 > 장점? 실행도중 필요한 객체의 함수를 호출하므로 유연성을 가지고 있다.

 > 단점? 변수의 예상치 못한 타입으로 인해 안정성이 저하된다. 



위의 예제를 보면 Person을 선언하여 print를 호출하였으므로 Person의 함수가 호출된다.

이후에 Person클래스를 JinSoo클래스 객체로 변경을 한 경우 Jinsoo의 print함수가 호출된다.

이 과정은 실행 도중 print함수가 부모클래스에서 자식클래스 함수로 변경이 된다. 

포인터가 가리키는 객체에 따라 호출되는 함수가 변경이 되는 것이 동적바인딩이다.



* 상속에서의 오버로딩과 오버라이딩



부모 Class의 함수가 오버로딩 되어 있는 경우, 자식클래스에서 일부의 함수만 오버라이드 할 경우 오류가 발생한다.

부모 클래스에서 오버로드 된 함수를 모두 오버라이드 해야한다.  

이 문제는 가상함수로 만들어도 같은 오류가 발생 하였다.