개발자 면접 공부/C-C++

C++ RTTI 에 대해

chogyujin 2022. 7. 14. 20:45
728x90

오늘은 RTTI에 대해 공부하겠습니다.


RTTI란?

Run Time Type Information의 약자로 프로그램 실행 중에 개체의 형식이 결정될 수 있도록 하는 매커니즘입니다.

다시 말해 실행중 포인터가 가르키는 객체의 타입을 알 수 있게 해주는 하나의 방법입니다.

 

기본적으로 RTTI가 필요한 이유는 A 타입에서 B 타입으로 변경할때 정보가 필요합니다.

 

컴파일시간에 타입 변환이 이루어진다면 굳이 RTTI가 필요 없습니다 하지만 컴파일 단계에서 충분히 알 수 있고
특정 타입으로 확정할 수 있기 때문입니다.(런타임 중에 타입 변환이 이루어질 경우)

 

virtual 클래스로부터 상속이 하나라도 존재하면 RTTI를 사용하고 있습니다.

 

dynamic_cast 또한 RTTI에 매우 의존적입니다. 초기단계 분석에서 static_cast 분석을 사용하고, 불가능하면 RTTI를
사용하는 구조로 설계되어있습니다.

 


RTTI 의 대한 예제 코드

#include<iostream>

using namespace std;

class Car
{
public : 
	void Open()
	{
		cout << "차문 개방" << endl;
	}
};

class BasicCar : public Car
{
public:
	void Open()
	{
		cout << "옆으로 열림" << endl;
	}
};

class SuperCar : public Car
{
public:
	void Open()
	{
		cout << "위로 열림" << endl;
	}
};

int main()
{
	Car* B = new BasicCar();
	Car* S = new SuperCar();

	cout << typeid(*B).name() << endl;
	cout << typeid(*S).name() << endl;
}

virtual 함수가 없을경우

가상 함수 테이블이 없으므로 RTTI 정보를 갖지 못하기때문에 Car라고 뜬다.

하지만 가상함수가 있을경우애는 어떤일이 벌어질가?

#include<iostream>

using namespace std;

class Car
{
public : 
	virtual void Open()
	{
		cout << "차문 개방" << endl;
	}
};

class BasicCar : public Car
{
public:
	void Open()
	{
		cout << "옆으로 열림" << endl;
	}
};

class SuperCar : public Car
{
public:
	void Open()
	{
		cout << "위로 열림" << endl;
	}
};

int main()
{
	Car* B = new BasicCar();
	Car* S = new SuperCar();

	cout << typeid(*B).name() << endl;
	cout << typeid(*S).name() << endl;
}

놀랍게도 타입의 정보를 가져올수있다.
virtual이 사용이되면 가상 함수 테이블안에 RTTI 정보가 있기 때문에 가져올수가 있다.

 

또한 dynamic_cast도 RTTI에 의존을 하고있으므로 RTTI 기능을 끄면 곤란해진다.