C++에서는 네 가지 유형의 캐스트 연산자가 있으며, 각각은 서로 다른 목적과 사용 사례에 대해 설계되어 있다.
이들 캐스트 연산자는 타입 변환을 수행하며, 특정 캐스트 연산자는 추가적인 런타임 검사를 제공한다.
static_cast:
static_cast는 컴파일 타임에 타입 변환을 수행한다.
관련된 타입 간의 변환에 사용된다(예: 기본 타입 간의 변환, 상속된 클래스 간의 포인터 변환).
float f = 10.5;
int i = static_cast<int>(f); // float에서 int로 변환
reinterpret_cast:
reinterpret_cast는 바이트 레벨에서 타입 변환을 수행한다.
서로 관련이 없는 타입 간의 변환에 사용된다. 이것은 위험할 수 있으며, 제대로 사용되지 않으면 정의되지 않은 동작을 유발할 수 있다.
int i = 42;
int* pi = &i;
char* ch = reinterpret_cast<char*>(pi); // int 포인터를 char 포인터로 변환
const_cast:
const_cast는 객체의 constness를 추가하거나 제거한다.
const 객체에 대한 non-const 참조 또는 포인터를 얻을 때 사용된다.
const int ci = 10;
int* pi = const_cast<int*>(&ci); // const int 포인터를 non-const int 포인터로 변환
dynamic_cast:
dynamic_cast는 런타임에 타입 변환을 수행한다.
다형성을 가진 클래스 계층에서 사용된다. dynamic_cast는 런타임에 객체 타입을 검사하며, 변환할 타입이 올바른지 확인한다.
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 런타임에 Derived 포인터로 변환
각 캐스트 연산자는 특정 상황과 요구 사항에 따라 사용된다. static_cast와 reinterpret_cast는 주로 컴파일 타임에 타입 변환을 수행하며, const_cast는 constness를 조절하고, dynamic_cast는 런타임에 타입 검사와 안전한 다운캐스팅을 수행한다.