type casting

type casting

2025년 10월 10일

cast 들의 차이와 원리 #

  • C스타일 캐스트 : const 제거 -> static -> reinterpret 순서대로 진행
  • const_cast : const나 volatile 키워드 추가, 제거. 사실 만약 함수에서 요구하더라도 함수를 변경해야하지, 실제로는 사용하지 않는게 일반적으론 맞지만, 서드파티 라이브러리 등 어쩔 수 없는 경우가 있다.
  • 묵시적 형변환
    • 정수형 <-> 부동소숫점
    • T* -> void*
    • 업캐스팅
    • Enum -> int
  • static_cast : 컴파일타임에 의미가 있는 형변환을 한다.
    • 묵시적 형변환으로 가능한것들
    • void* -> T*
    • int -> Enum : 대신 값 범위는 보장되지 않음
    • 다운캐스팅 : 대신 런타임체크가 없어서 안전하진 않음
  • reinterpret_cast : 완전한 강제 형변환을 한다.
    • const_cast나 static_cast에서 되는것들은 reinterpret_cast에서 안된다
    • int* <-> double* : 이런 완전 다른 타입도 강제 형변환 가능. static_cast는 에러가 발생한다.
  • dynamic_cast : 런타임에 다운캐스팅 타입 안정성을 보장해줌.
    • 실패시 포인터는 널포인터, 레퍼런스는 예외발생

C style 형변환 #

묵시적 형변환 #

const_cast #

static_cast #

reinterpret_cast #

dynamic_cast #

무조건적으로 되는거 아님 dynamic_cast의 원리는 vtable을 참조해서 RTTI 객체를 확인하는 것이기 떄문에 폴리모픽된 클래스(virtual 이 하나라도 포함된 클래스)에 대해서만 지원한다.

 1class B {
 2    int b;
 3};
 4
 5class D : public B {
 6    int d;
 7};
 8
 9D* d = new D();
10B* b = dynamic_cast<B*>(d);

3a00afcd-29ba-4b6a-8278-0e6981fa3d80

RTTI를 끄고 dynamic_cast를 직접 구현?

comments powered by Disqus