Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++의 RTTI(런타임 유형 정보)란 무엇인가?


이 글에서는 C++의 RTTI(런타임 유형 정보, Runtime Type Information)가 무엇인지 자세히 알아보겠습니다.

C++에서 RTTI는 프로그램 실행 중에 객체의 데이터 타입에 대한 정보를 제공하는 메커니즘입니다. 다만 이 기능은 클래스에 최소한 하나 이상의 가상 함수(virtual function)가 존재할 때만 사용할 수 있습니다. RTTI를 활용하면 프로그램이 실행되는 도중에도 객체의 실제 타입을 동적으로 판별할 수 있으며, 대표적인 활용 예로 dynamic_cast 연산자와 typeid 연산자가 있습니다.

아래 첫 번째 예제 코드는 정상적으로 작동하지 않습니다. 컴파일 시 "cannot dynamic_cast base_ptr (of type Base*) to type 'class Derived*' (Source type is not polymorphic)"라는 오류가 발생합니다. 그 이유는 해당 예제의 Base 클래스에 가상 함수가 전혀 없어서 다형적(polymorphic) 타입으로 인식되지 않기 때문입니다. 가상 함수가 없으면 vtable(가상 함수 테이블)이 생성되지 않아 런타임에 객체의 실제 타입을 추적할 수 없습니다.

예제 코드 1 – 가상 함수가 없는 경우

#include<iostream>
using namespace std;
class Base { };
class Derived: public Base {};
int main() {
    Base *base_ptr = new Derived;
    Derived *derived_ptr = dynamic_cast<Derived*>(base_ptr);
    if(derived_ptr != NULL)
       cout<<"It is working";
    else
       cout<<"cannot cast Base* to Derived*";
    return 0;
}

이제 Base 클래스에 가상 함수를 하나 추가하면 어떻게 될까요? 클래스가 다형적 타입으로 인식되면서 dynamic_cast가 정상적으로 작동합니다.

예제 코드 2 – 가상 함수를 추가한 경우

#include<iostream>
using namespace std;
class Base {
    virtual void function() {
       //empty function
    }
};
class Derived: public Base {};
int main() {
    Base *base_ptr = new Derived;
    Derived *derived_ptr = dynamic_cast<Derived*>(base_ptr);
    if(derived_ptr != NULL)
       cout<<"It is working";
    else
       cout<<"cannot cast Base* to Derived*";
    return 0;
}

실행 결과

It is working

정리하면, RTTI는 다형성을 기반으로 하는 기능이므로 반드시 가상 함수가 있는 클래스에서만 사용할 수 있습니다. 가상 함수의 존재 여부가 곧 RTTI 활용 가능 여부를 결정한다는 점을 기억하면 됩니다.