본문 바로가기
Programming/C C++

C++ 정적 바인딩과 동적 바인딩

by Eisen Sophie 2020. 9. 29.

C++에서는 상속이라는 개념이 있다.

 

부모 클래스와 자식 클래스에 같은 이름의 함수가 존재한다 가정한다.

 

위의 그림을 코드로 표현하면 아래와 같다.

class Vehicle 
{
public:
	void drive(){ cout << "Vehicle move" << endl; };
};

class Airplane : public Vehicle
{
public:
	void move(){ cout << "Airplane move" << endl; };;
};

class Car : public Vehicle 
{
public:
	void move(){ cout << "Car move" << endl; };;
};

int main(){
	Vehicle* v = new Vehicle();
    v->move(); // Vehicle move
	
	Vehicle* v1 = new Car();
    v1->move(); // Vehicle move
    
	return 0;
}

위의 코드에서 move()는 정적 바인딩이다.

 

 

class Vehicle 
{
public:
	virtual void drive(){ cout << "Vehicle move" << endl; };
};

class Airplane : public Vehicle
{
public:
	void move(){ cout << "Airplane move" << endl; };;
};

class Car : public Vehicle 
{
public:
	void move(){ cout << "Car move" << endl; };;
};

int main(){
	Vehicle* v = new Vehicle();
    v->move(); // Vehicle move
	
	Vehicle* v1 = new Car();
    v1->move(); // Car move
    
	return 0;
}

위의 코드에서 move()는 동적 바인딩이다.

 

 

 

정적 바인딩을 했는지 동적 바인딩을 했는지에 따라서,

 

move()의 결과가 다르게 나온다.

 

정적 바인딩을 하면 포인터의 형태를 따라가 그것의 move()를 실행시킨다.

 

동적 바인딩은 할당받은 형태를 따라가 그것의 move()를 실행시킨다.

 

그럼으로 정적 바인딩으로 move를 실행 시키면, Vehicle move가 출력이 된다.

 

그러나 동적 바인딩으로 move를 실행 시키면, Car move가 출력 된다.

 

동적 바인딩을 하기 위해서는 Base class의 함수 앞에 virtual만 붙이면 된다.

 

 

 

동적 바인딩이 느린 이유

프로그램 실행시에 v1이라는 오브젝트를 만들게 된다.

 

그리고 그 오브젝트에는 가상 테이블의 주소를 가지고 있다.

 

그리고 가상테이블을 통해서 사용자가 요구하는 함수를 불러오게 된다.

 

이러한 프로세스는 가상테이블을 통하는 절차가 추가 됨으로, 정적 바인딩 보다는 느릴수 밖에 없다.