- C 스타일의 형변환은 코드가 컴파일 되면 어떤 형 변환이든 강제로 수행함.
- 변환이 잘못되었더라도 경고나 오류가 발생하지 않고, Undefined Behavior를 초래할 수 있음.
c++ 형변환 연산자
1. static_cast
- 컴파일 타임에 타입 변환 수행
- 기본 데이터 타입 간의 변환, 상속 관계에서 부모-자식 클래스 간 변환, void 포인터와 객체 포인터 간 변환 등에 사용.
// 기본 타입 변환
int a = 10;
double b = static_cast<double>(a); // int -> double 변환
// 부모-자식 클래스 변환
class Base {};
class Derived : public Base {};
Base* base = new Derived();
Derived* derived = static_cast<Derived*>(base); // 부모 -> 자식 변환
2. dynamic_cast
- 런타임에 타입 검사 수행
- 주로 다형성을 사용하는 클래스에서 안전한 형변환을 위해 사용
- RTTI(Runtime Type Information)를 사용, 포인터 변환이 실패하면
nullptr 을 반환하고, 참조 변환이 실패하면 std::bad_cast 예외를 던짐.
- 가상 함수가 없는 클래스에서 사용 불가
class Base {
public:
virtual ~Base() {} // 다형성을 위해 가상 소멸자가 필요
};
class Derived : public Base {};
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base); // 성공: derived는 유효한 Derived 객체
3. const_cast
const 또는 volatile 속성을 제거하거나 추가하는데 사용.
- 주로 const 멤버 함수를 재정의하거나, const 객체를 비 const로 처리해야하는 경우 사용.
- 실제로
const로 선언된 데이터를 변경하면 정의되지 않은 동작이 발생.