int i1 = (int)myFloat;
static_cast
언어에서 지원하는 가장 일반적인 타입캐스팅
int n = 9; double result = static_cast<double>(n);
객체를 클래스 계층에서 다운캐스팅할 때 사용 가능
객체 참조형에서 사용 가능(객체 자체 X)
Parent* parent = new Parent(); Child* child = static_cast<Child*>(parent);
dynamic_cast
런타임 타입 정보 검사를 수행하여 변환이 적합한 클래스 계층 간 이동인지 확인
런타임 타입 정보는 vtable에 저장되기 때문에 dynamic_cast가 타입 검사를 하기위해서는 클래스에 하나 이상의 virtual 메서드가 있어야 함
const_cast
상수 속성을 없애는 캐스팅 방법
라이브러리를 사용하는 등의 상황에서 융통성을 발휘하여 사용하는 경우가 있음
//예시 extern void LibraryMethod(int* n); void myMethod(const int* n) { LibraryMethod(const_cast<int*>(n)); }
reinterpret_cast
static_cast 보다 강력한 캐스팅 방법
전혀 관계없는 타입으로 변환 가능
T1* tp = new T(); T2* tp2 = new T2(); tp = reinterpret_cast<T1*>(tp2);
int n = int(myFloat);
타입캐스팅 방법 정리
상황 | 캐스팅 방법 |
---|---|
const 속성 제거 | cosnt_cast |
int, double 간 변환처럼 언어 자체에서 허용되는 변환을 명시적으로 수행 | static_cast |
커스텀 생성자나 변환 연산자가 구현되어 있을 때의 명시적인 변환 | static_cast |
전혀 관계없는 두 객체 간의 변환 | 불가능 |
같은 클래스 계층에 속하는 서로 다른 클래스 객체의 포인터 간 변환 | dynamic_cast or static_cast |
같은 클래스 계층에 속하는 서로 다른 클래스 객체의 참조 간 변환 | dynamic_cast or static_cast |
전혀 관계없는 두 포인터 간의 변환 | reinterpret_cast |
전혀 관계없는 두 참조 간의 변환 | reinterpret_cast |
함수 포인터 간의 변환 | reinterpret_cast |
결론
기본 자료형의 타입캐스팅은
double myD = 1.1; int n = (int)myD; int n2 = int(myD);
와 같은 방식으로 변환하는 것이 가독성에 더 좋아보이며
이를 제외하고는 위에 설명한 타입캐스팅 방식을 활용하여
명시적으로 보여주는 것이 좋아 보임