Language/C++

C++ :: RTTI (Run-Time Type Information)

VallistA2015. 5. 29. 10:54

RTTI는 C++에서 해당 포인터의 타입을 알아올 때 필요하다.

어떤 엔진이든, RTTI는 보이지 않는 곳에서 사용이 되며 Template을 사용할 때 예외처리로 상당히 많이 사용하게 된다.

 

원래 C++ 에서는 RTTI에 대한 표준화된 지원을 하지 않았다. 왜냐하면 C와의 후방 호환성을 유지할 수 없었기 때문과 효율성에 대해서 생각을 할 때 전혀 효율성이 존재하지 않을꺼란 믿음 때문이었다. Smalltalk, Lisp 같은 RTTI를 사용할 수 있는 언어들은 느린 성능 때문에 특징이 없어졌으며 동적 타입 체크의 성능 패널티는 시스템에 대한 타입을 저장하기 위해서 정보, 실행시간 객체 타입을 검색하는 시간이 매우 느린 과정이 있기 때문에 기피했다.

 

하지만 C++은 다중상속의 추가로 RTTI는 대두가 되기 시작했고 정적 타입체크 및 가상함수들이 충분하지 못하다는 것에 대해 반박이 불가능 했다. 그래서 RTTI가 생기게 되었다.

 

RTTI가 추가가 되면서 std::type_info가 std 에 추가되었다.

 

가정

 

class, 자료형에 관계없이 동작해야하는 프로그램일 때 클래스 자료형이 들어갈 때가 있고 노멀한 자료형이 들어갈 수가 있는데 그 중 class 자료형이 들어간다고 가정 했을때 class 자료형이 들어갈 때는 class 자료형이 가지고 있는 함수인 foo 를 호출한다고 하자. 그리고 그 의외의 경우에는 자료형 자체를 사용한다고 했을때 우리는 어떻게 알아와야 하는가?

클래스가 한두개가 아니고 미리 만들어져 있는 자료형이 아니라고 했을때 우리는 유추가 불가능하다.

 

RTTI를 쓰는 이유는 실행 중 기반 클래스 타입 포인터를 알아내는데에 목적을 두고 있다.

 = 다형성을 가진 객체에 대해 정확한 타입 추론을 하는데 목적이 있으며 Template과 시너지가 좋다.


 

예시를 보도록 하자.

 

1. 의문

 

 

위의 소스를 실행시켜보면

 

class Toy

class Toy

 

라는 실행결과가 나온다.

왜 이렇게 나올까?

 

RTTI는 비 다형성 클래스에 대해서 선언하여 클래스 타입을 조회할 때 상속관계에서 하나 이상의 가상함수를 가지고 있어야 한다.

RTTI 기능이 활성화 되어야 하용할 수 있는 제약사항을 Dynamic_cast도 동일하게 가진다.

하지만 잘 짜여진 클래스에서는 가상함수를 사용할 일이 많기 때문에 이러한 제약은 프로그래머가 걱정할 필요가 없다. 보통 인터페이스로써 사용되는 추상적인 클래스가 존재하기 때문이다.

 

2. 해결

 

 

이렇게 해주면 깔끔하게 RTTI를 구현할 수 있다.

댓글

  • BluDragon2016.10.01 13:53 즉, 가상함수 테이블이 있어야 된다는건가요?
    그럼 각각 foo()를 실행했을때 Toy 클래스주소여도 Car,Doll의 foo()가 실행되겠군요
  • 공부중2017.10.31 14:26 1번의 경우에도 가상 소멸자가 존재하기 때문에 아래와 같은 결과가 나타나지 않나요?
    가상 소멸자를 정의하면서 가상함수 테이블이 생성되니깐요?
댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 16

Total : 417,261

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘