C++에서 한 자료형의 값을 다른 자료형으로 변환할 때 사용됩니다.
C 언어에서 사용되던 방식입니다.
<예시>
double x = 3.14;
int y = (int)x; // double을 int로 변환
변환할 수 있는 타입이 무엇인지 명확하게 알 수 없기 때문에 안전하지 않을 수 있습니다.
컴파일 타임에 타입 변환을 수행하며, 반환하려는 타입이 명확할 때 사용합니다.
업캐스팅은 안전하지만, 다운캐스팅은 안전하지 않을 수 있습니다. dynamic_cast 권장
float x = 3.14;
int y = static_cast<int>(x); // float을 int로 변환
잘못된 타입 변환을 시도하면 컴파일 에러가 발생합니다.
런타임에 타입 변환을 수행하며, 주로 다형성(polymorphism)을 사용할 때 사용됩니다.
적어도 하나의 가상 함수(virtual function)가 있어야 합니다.
#include <iostream>
using namespace std;
class Base {
public:
virtual void show() { cout << "Base class" << endl; } // 가상 함수
};
class Derived : public Base {
public:
void show() override { cout << "Derived class" << endl; }
};
int main() {
Base* b = new Base(); // Base 객체 생성
Derived* d = dynamic_cast<Derived*>(b);
return 0;
}
변환이 안전하지 않으면 nullptr 또는 예외를 발생시킬 수 있습니다.
상수성(constness)을 변경할 때 사용됩니다. 주로 const가 붙은 변수에서 const를 제거하거나 추가할 때 사용됩니다.
const int x = 5;
int* y = const_cast<int*>(&x); // const 제거
*y = 10;
실제로 const로 선언된 변수에 대해 const_cast로 변경하는 것은 위험할 수 있습니다. 이는 const 규칙을 위반하는 것이기 때문에, 프로그램이 의도대로 동작하지 않을 수 있습니다.
비트 수준에서 포인터나 참조를 강제로 변환할 때 사용됩니다.
int x = 42;
char* y = reinterpret_cast<char*>(&x); // int 포인터를 char 포인터로 변환
reinterpret_cast는 매우 강력하고 위험할 수 있습니다. 타입이 전혀 다른 메모리 구조를 해석하게 되므로, 잘못 사용하면 프로그램이 예기치 않게 동작할 수 있습니다.