블로그

C++ 에서 정적바인딩, 동적바인딩 이란? 본문

C++

C++ 에서 정적바인딩, 동적바인딩 이란?

confielder 2021. 12. 9. 18:13

객체는 다양한 자료형을 가질 수 있으며, 클래스에서 부모 클래스의 객체가 자식 클래스의 자료형으로 대입해줄 수 있다.

 

Animal *animal = new Dog();

 

이 코드의 의미는 Animal 클래스의 객체인 animal 이 Dog 클래스를 가리키고 있는 것인데 이러면 animal이라는 객체는 어디에 속해있는 것일까?

 

C++에서는 기본적으로 이런상황일 때 animal 객체는 Animal 클래스를 기준으로 멤버 메써드를 실행시킨다.

 

따라서 Animal 과 Dog 클래스에 각각 Speak()라는 함수가 오버 라이딩되어있다면 animal 은 Animal 클래스의 Speak()를 호출시키며, 이것은 우리가 원하는 결과가 아닐 수 있다.

 

이러한 상황을 해결하기위해 객체가 실제 가리키는 자료형의 함수를 호출시키기 위해서는 동적 바인딩을 시켜야 한다.

 

동적 바인딩은 프로그램이 실행하는 중에 동적으로 객체가 가리키는 자료형의 함수를 호출시켜주는 것으로 Virtual 키워드를 통해 가상 함수라는 것을 만들어서 사용 가능하다.

 

Virtual 키워드는 부모 클래스의 오버 라이딩된 함수에 Virtual void Speak() 이런 식으로 넣으면 되며, 정적 바인딩 보다 느린다는 것을 알아야 한다.

 

느린 이유로는 가상 함수를 사용하면 클래스마다 가상 테이블이라는 곳에 가상 함수가 따로 저장이 되는데 객체를 생성할 때 해당 클래스의 가상 테이블 주소가 함께 저장되어 프로그램이 실행되면 가상 테이블의 주소로 점프한 다음 실제 함수 위치로 다시 점프를 하는 구조이다.

 

이는 실제 함수의 주소를 컴파일 시에 알고 실행하는 것보다 느릴 수밖에 없다.

 

결과적으로 Virtual 키워드를 사용하여 동적 바인딩시켜서 객체가 실제 가리키는 자료형(클래스)의 함수를 호출할 수

있다. 

 

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

C++ std::vector 에 대해  (0) 2021.12.26
C++ "Inline"함수란  (0) 2021.12.23
C++ 깊은 복사 , 얕은 복사 그리고 복사 생성자에 대하여  (0) 2021.10.04
C++ "Static" 에 대하여  (0) 2021.09.29
C++ "new" 키워드에 대하여  (0) 2021.09.20