본문 바로가기

Programming/C & C++

[c++] 4가지 캐스팅(static_cast, const_cast, reinterpret_cast, dynamic_cast)

Casting

C++에서 기존 C스타일의 캐스팅을 사용할 수 있지만 C++의 4가지 캐스팅 방법을 사용하는 것이 많은 타입 검사를 해주기 때문에 더 안전하게 사용할 수 있다.

const_cast

const 변수의 상수 속성을 없앨 때 사용한다. const 속성이 있는 변수는 const 속성을 계속 유지하는게 올바르기 때문에 왠만하면 사용할 일이 없다.

void foo(int a) {
    // blah blah ~~
}
const int a = 1;
Foo(const_cast<int>(a));

static_cast

가장 일반적인 타입 변환. 런타임 타입 검사는 하지 않는다. 업캐스팅, 다운캐스팅 모두 가능하다.

double a = 1.1;
int b = static_cast<int>(a);

reinterpret_cast

C++에서는 통상적으로 허용되지 않지만 프로그래머가 의도한 특별한 상황에서 타입 간 변환을 강제적으로 할 수 있다.

void foo(void* p) {
    int a = reinterpret_cast<int>(p);
}

dynamic_cast

클래스 계층에 대한 런타임 타입 정보(RTTI) 검사를 수행하여 해당 변환이 적합한 클래스 계층 간 이동인지 확인한다. RTTI는 객체의 vtable에 저장되기 때문에 클래스에 하나 이상의 virtual 메서드가 있어야 한다.

class Base { virtual void foo(); };
class Derived : public Base { virtual void foo(); };

int main() {
    Base* b;
    Derived* d = new Derived();
    b = d;
    d = dynamic_cast<Derived*>(b);
    
    return 0;
}