주의) 오래전 Effective C++을 바탕으로 보관한 자료이기 때문에 최신 C++ Trend 가 전혀 반영되어있지 않은 포스팅입니다.


 C++C에서의 Type Casting 보다 확장되고 안정성 있는 Type casting 기법 4가지를 제공한다.


(1) static_cast

 : 크게 implicit castexplicit cast로 나뉜다.



Expressionstatic_cast<type>(expression)으로 표현된다.

 

(2) dynamic_cast

 : 상속 관계를 가로지르거나 하향시킨 클래스(파생 클래스) 타입으로 캐스팅할 때 사용된다. 상속 계층 간에만 사용해야하며 가상 함수가 없는 타입에 적용시킬 수 없고 상수성 제거에도 적용할 수 없다.

dynamic_cast<type>(expression)


-> 일반적으로 사용하는 캐스트는 static_cast이다. 하지만 다형성을 이용하려는 경우에는 얘기가 다르다. 런타임에 다형성을 이용한 모호한 캐스팅이 이루어질 경우 static_cast는 문제가 됨에 반해, dynamic_cast는 실제 Instance를 조사하기 때문에 런타임 오류가 발생하지 않는다. 예를 들어 BC의 부모 클래스일때,



일 때는 다형성의 정의에 의하여 BC의 포인터를 가리킬 수 있으므로 문제가 안되지만,



의 경우에는 BC의 타입으로 변환될 경우에 문제가 생기게 된다

그런데 static_cast로는 타입체크를 하지 않기 때문에 변환되서 문제가 되는 값이 넘어가게 된다. 반면에 dynamic_cast로 변환시에는 NULL값으로 변환된다.

 

(3) reinterpret_cast

 : 연관성이 없는 포인터 타입을 변환하기 위해서 사용된다. 예를 들어


이 경우 위와 같이 static_cast로 변환을 시도하는 경우, 문법적으로 불가능하지만, reinterpret_cast를 이용하면 연관성 없는 두 포인터간 캐스팅이 가능하다

하지만 논리적으로 불안정하며 포인터에 대한 캐스팅만 수행이 가능하고 const 타입에 대한 캐스팅이 안된다.

 

(4) const_cast

 : 포인터 타입과 참조형에 대해서만 사용되는 캐스팅이며 동일 타입 내에서만 사용이 가능하다

그 외에는 is a 관계를 포함한 어떤 관계를 맺고 있더라도 불가능하다. 일반적으로 상수목적으로 지정된 객체 등에 대해서 변수목적으로 사용하고자 할 때 이용한다

또한 volitile 타입 한정자를 지닌 volatile 타입 객체를 참조형으로 변환하고자 할 때도 사용된다. Effective C++에서 이에 대해서 많이 다루고 있으니 참조하자.

 

'Programming Language > C&C++' 카테고리의 다른 글

Stdafx.h 란?  (0) 2018.09.25
RAII 의 개념 정리  (0) 2018.08.08

+ Recent posts