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);
RTTI를 끄고 dynamic_cast를 직접 구현?