C++의 기본 바인딩은 정적 바인딩이다.

C++ 포큐아카데미

Animal을 상속받아 만든 Cat 클래스가 있다. Cat 클래스에 Speak 메소드를 오버라이딩 했다.

두개의 오브젝트를 만드는데 타입을 하나는 Cat으로 하나는 부모클래스인 Animal로 했다. 그때 speak()메소드를 호출하면 누가 나올까?

 

JAVA는 무조건 오버라이딩된 자식 메소드가 나오고 C++는 무늬 즉 타입(포인터)따라 간다.

JAVA의 기본 바인딩은 동적 바인딩이고 C++의 기본 바인딩은 정적 바인딩이다.

 

정적 바인딩

C++ 포큐아카데미

위의 그림에서 Cat 오브젝트를 만들고 타입도 Cat*다. 그래서 힙에 할당한 모든 메모리를 그냥 쓰면된다. 전혀 문제가 안됨

 

C++ 포큐아카데미

하지만 위의 그림은 Cat 오브젝트를 만들었지만 타입은 부모 클래스 즉 Animal이다. 이럴때 Animal의 것만 포인팅한다.

Cat의 메모리 영역에 접근하고 싶으면 Type, 포인터를 Cat*으로 변경해야 한다.

 

C++ 포큐아카데미

정적 바인딩을 그림으로 잘 표현한 예다. C++는 기본적으로 타입 따라간다. 왜냐? 정적바인딩이니깐

 

 

가상함수(동적 바인딩)

C++ 포큐아카데미

그렇다면 C++에서 자바처럼 무조건 만들어진 오브젝트 즉 자식 클래스의 메소드가 호출되려면 어떻게 해야 할까?

virtual 키워드를 붙이면 된다. virtual을 붙이면 자바처럼 동적 바인딩을 하겠다는말이다.

참고로 자바는 기본적으로 모든 것이 다 virtual이고 final을 붙이면 정적 바인딩이 된다.

 

동적 바인딩은 실행 중에 어떤 함수를 호출할지 결정되고 정적 바인딩 보다 느리다. 실행 중에 어떤 함수를 결정하기 위해 가상 테이블이 생성된다.

 

가상테이블

C++ 포큐아카데미

컴파일시에 virtual을 정의한 메소드에 한해서 가상 테이블이 생성되는데 오브젝트를 생성할 때 해당 클래스의 가상 테이블 주소가 함께 저장된다. (EX __vfptr, 0x00459bd8)

 

위의 가상테이블을 활용하면 오브젝트가 메소드를 호출할때 가상테이블로 가서 "야! Move 메소드 호출할건데 부모거말고 내걸로 호출해라! 니가 주소 알고 있지? 그 주소로 Jump해서 호출하고와라" 이런식으로 가상 테이블에 접근해서 메소드를 호출한다. 그렇기 때문에 느리다.

 

'C++' 카테고리의 다른 글

C++ 객체 백터 Vector  (0) 2020.04.17
C++ iterator 개념  (0) 2020.04.17
C++ 멤버함수의 메모리 위치  (0) 2020.04.09
C++ 객체 생성  (0) 2020.04.02
C++ 임시객체(이동 생성자) 중요!  (0) 2020.02.07

+ Recent posts