RTTI(Run Time Type Infomation)
RTTI란
RTTI란 Run Time Type Infomation으로
프로그램 실행 즉 런타임 중 타입정보를 식별할 수 있는것 입니다.
정확하게 실행중에 기반 클래스 타입 포인터의 실체를 밝혀내는것입니다.
RTTI는 정적 타입체크와 각상함수들로는 해결이 불가능한 문제들이 제시되어
C++ 표준화 위원회가 RTTI를 추가 승인하게 되어 표준이 되었습니다.
1991: First meeting of WG21
1994: CD1 <RTTI 등장 : CD2에 내용이 없어서 CD1으로 판단하였는데 정확하지 않습니다>
1996: CD2 <Exception Handling, Template 등장>
1997: FDIS (Final Draft International Standard)
1998: C++ Standard (C++98)
RTTI가 필요한 이유
RTTI는 다형성을 가진 클래스 즉 가상함수가 하나라도 포함된 클래스의 타입을 알아내기 위해서 나왔다고 볼 수 있습니다.
많은 이유 중 하나는 가상함수가 포함된 클래스의 타입은 동적 바인딩에 의하여 런타임에 결정되게 되므로
런타임에 가상함수가 포함된 클래스의 타입을 확인하기 위하여 만들어졌습니다.
클래스의 다형성은 가상함수에 의해 구현되므로
RTTI는 가상함수를 갖는 클래스의 상속관계에서 사용이 가능합니다.
가상함수가 없는 클래스는 가상함수 테이블이 없기 때문에
RTTI에 대한 정보 또한 존재하지 않아 포인터의 타입을 가져와 처리를 합니다.
RTTI를 이용한 대표적 기능
- typeid
- type_info
- dynamic_cast
Typeid는 두 객체의 데이터형이 같은지 확인이 가능하고 개체의 정확한 형식을 식별하는데 사용됩니다.
Typeid는 <typeinfo> 헤더를 선언하고
typeid(변수 or 자료형)으로
#include <typeinfo>
#include <iostream>
int main()
{
const std::type_info& type = typeid(int);
std::cout << type.name() << std::endl;
return 0;
}
와 같이 선언이 가능합니다.
type_info는 이 typeid연산자의 반환 값으로 <typeinfo> 헤더 파일에 정의되어 있는 클래스이며
어떤 특별한 데이터형에 대한 정보를 저장합니다.
이 type_info는 특별한 데이터형을 비교할 수 있도록 == 와 !=의 연산자가 사용이 가능합니다.
마지막 dynamic_cast는 이 RTTI에 대하여 의존적이며
런타임에 상속 관계를 분석하여 형 변환이 가능하면 형 변환을 진행하고
불가능하다면 포인터의 경우 nullptr을 반환, 참조의 경우 std::bad_cast를 throw합니다.
제가 작성한 코드에서는 dynamic_cast를 위 3가지 중 제일 많이 사용하였으며
추후 캐스팅을 다룰 예정이지만 상속관계를 체크하므로 static_cast보다는 조금 느린 단점이 존재합니다.
'STUDY > C++' 카테고리의 다른 글
업캐스팅과 다운캐스팅 (0) | 2022.06.14 |
---|---|
오버로딩, 오버라이딩 (0) | 2022.06.05 |
OOP-객체 지향 프로그래밍 (0) | 2022.05.30 |