프로그래밍/C++

#48. C++ 캐스팅

코딩하는상후니 2022. 7. 20. 22:06

 

 
*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