RTTI(Runtime Type Information)

Min·2024년 7월 13일
0

CPP

목록 보기
7/14
post-thumbnail

RTTI

  • RTTI란?
    말그대로 런타임 시점에 클래스나 자료형을 확인하는 것을 말합니다.
    RTTI를 통해서 정적인 자료형, 명시적인 자료형만 확인할 수 있는 것이 아니라, 업캐스팅 된 상태의 파생클래스 자료형까지 확인할 수 있습니다.

  • msdn에서 말하는 C++의 RTTI
    msdn에서는 C++이 지원하는 RTTI가 세가지라고 말합니다.
  1. dynamic_cast 연산자
  2. typeid 연산자
  3. type_info 클래스
    msdn 런타임 형식 정보 링크

1. dynamic_cast

C++에서 지원하는 형변환 연산자 중 하나입니다. 상속관계에 있는 클래스간 형변환을 담당하며, RTTI를 통해 안전한 Down Casting을 보장합니다. 하지만 다른 형변환에 비해서 굉장히 느리다는 단점이 있습니다.

2. typeid

typeid 연산자는 const type_info& 형태로 객체 정보를 반환하는 연산자입니다

3. type_info

클래스 정보를 담는 클래스 입니다. 클래스의 정보를 프로그래머가 사용하기 좋도록 문자열로 변환해주는 기능도 있습니다.


RTTI가 클래스 정보를 확인하는 방법

RTTI는 가상함수 테이블을 체크하여 해당 객체의 정보를 확인합니다.

  • 가상함수 테이블이 없다면 typeid 연산자를 통해서 typeid를 확인할 때, 정적인 자료형만 확인할 수 있고, 실제 자료형은 확인이 불가능합니다.
  • 가상함수 테이블이 없다면 dynamic_cast를 통한 다운캐스팅이 불가능합니다.(컴파일 오류)
#include <typeinfo> //RTTI기능 중 typeid 연산자와 type_info 클래스를 사용하기 위한 헤더
#include <iostream>

class Base
{
public:
	virtual ~Base()
	{

	}
};

class Derived : public Base
{
public:
	~Derived() override
	{

	} 
};

int main()
{
	Derived* derivedPtr = new Derived();
	Base* UpcastPtr = derivedPtr;
	Base* BasePtr = new Base();
	Derived* DowncastPtr = dynamic_cast<Derived*>(UpcastPtr);

	const std::type_info& confirm = typeid(*UpcastPtr); //typeid 연산자는 const type_info& 형태로 객체 정보를 반환
	//1. 가상함수 테이블 체크를 통해서 해당 객체의 형을 확인하기 때문에, 가상함수테이블이 없다면 정적인 클래스만 확인 가능(Base로 받았다면 Base로 반환)
	//2. 가상함수 테이블이 있다면, Up Casting을 한 상태에서도 실제 자료형을 확인할 수 있음
	//3. 가상함수 테이블이 없다면 dynamic cast를 이용한 다운캐스팅은 불가능함(컴파일 오류), 업캐스팅은 됨

	if (confirm == typeid(Base)) //type_info의 비교연산자(==, !=)를 이용해 타입 정보를 확인 가능
	{
		std::cout << confirm.name() << std::endl;
	}

	if (confirm == typeid(Derived))
	{
		std::cout << confirm.name() << std::endl;
	}

	size_t HASHCODE = confirm.hash_code(); //클래스 정보를 해쉬로 반환
	std::string Name = confirm.name(); //사람이 읽을 수 있는 형식으로 문자열을 반환합니다
	std::string Raw_Name = confirm.raw_name(); // 마이크로소프트 전용 함수라네요, 공간을 절약하기 위해 데코레이팅 된 방식으로 저장된답니다
	bool result = typeid(Base).before(confirm); //자료형이 앞서는지 확인(별로 몰라도 되는것 같음)
												//앞선다는 개념이 c++에서 정의한 사전식 기준이래요, 컴파일러에 따라서 다를수도 있다고....
												//별로 중요하지 않은것같음
	delete derivedPtr;
	delete BasePtr;
}
profile
티내는 청년

0개의 댓글