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 기능을 끄면 곤란해진다.
'개발자 면접 공부 > C-C++' 카테고리의 다른 글
C++ 스마트 포인터(Unique, Shared, Weak) (0) | 2022.07.19 |
---|---|
C++ 캐스팅의 종류 (0) | 2022.07.14 |
C++ 순수 가상 함수(추상 클래스) (0) | 2022.07.12 |
C++ Virtual(가상) 함수 (0) | 2022.07.12 |
C++ 포인터(Pointer) 레퍼런스(Reference) 차이 (0) | 2022.07.11 |