*static_cast
=> 문법적으로 가능하다면 형변환을 가능하게 해줌.
=> 타입 원칙에 비춰볼 때 상식적인 캐스팅만 허용.
=> 런타임 검사가 이루어지지 않음.
1. int -> float
2. Player* -> Knight* ( 다운캐스팅 ) 가능.
=> '안정성' 은 보장 못함
Player* p1 = new Player();
Knight* k1 = static_cast<Knight*>(p1);
결국, 컴파일 타임에 형변환에 대한 오류를 잡아줌.
*dynamic_cast
=> RTTI 를 활용한 형변환
=> RTTI ( RunTime Type Information )
프로그램 실행 때, 실시간으로 타입 정보를 알 수 있는 기법. virtual 함수를 찾는데에도 사용.
=> virtual 함수가 하나라도 등장한 클래스 상속에 사용해야함. ( RTTI 지원 )
virtual 함수가 없다면 동작하지 않음.
실제로 vfptr 을 이용해 형변환을 체크.
=> 다운 캐스팅 상황에 사용.
=> 형변환 실패 시, nullptr 로 반환.
=> vfptr 을 찾아가는 시간이 걸림.
=> static_cast / dynamic_cast 둘 다 확실한 상속관계에서 사용 가능.
Knight* k3 = dynamic_cast<Knight*>(p2);
if (k3 != nullptr) { cout << "dynamic_cast 성공!!" << endl; }
* virtual 키워드가 선언되어 있지 않으면 안되나??
=> 안됨.
*const_cast
=> const 를 붙이거나 때거나
*reinterpret_cast
=> 가장 위험하고 강력한 형태의 형변환
=> 're-interpret' : 다시-간주하다/생각하다.
=> 그 포인터랑 전혀 관계없는 다른 타입 변환.. 등
=> 포인터 타입 -> 포인터 타입 으로.
void* p = malloc(100);
Mage* m1 = reinterpret_cast<Mage*>(p);
free(p);
=> C스타일 형변환과 차이점은 뭘까 ??
1. reinterpret_cast 는 포인터 타입에 대한 캐스트만 수행 가능.
2. const 타입과 volatile 타입에 대해선 캐스팅할 수 없음.
*결론
C 스타일의 형변환 ( (float*)... 등 ) 을 보다 명시적으로 표현하기 위해
C++ 에서는 4가지 종류의 형변환으로 나누어놨다.
본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.
'프로그래밍 > C++' 카테고리의 다른 글
#50. 함수 포인터 (0) | 2022.07.20 |
---|---|
#49. 전방 선언 (0) | 2022.07.20 |
#47. 깊은 복사 & 얕은 복사 (0) | 2022.07.20 |
#46. 타입변환 (0) | 2022.07.20 |
#45. 동적할당 (0) | 2022.07.20 |