설명 -
C++에서 새로이 지원하게 된 명시적 캐스트 연산자들이다.
기능 및 특징 -
const_cast
클래스에서 const, volatile 및 __unaligned 특성을 제거합니다. 라고 msdn에 쓰여있다.
static_cast
명시적 형 변환을 위한 캐스트 연산자.
dynamic_cast
포인터나 레퍼런스를 기본 클래스-> 파생 클래스로의 다운 캐스팅과, 다중 상속에서 클래스 간의 안전한 타입 캐스팅에 사용된다. 안전하지만 느리다. 이 연산자를 사용하려면 '하나 이상의 virtual 함수'가 존재해야한다.
reinterpret_cast
타입이니 뭐니 하는 것을 따지지 않고 무조건적으로 변환해버린다. (reinterpret 다시 해석하다, 새로 해석하다) 대단히 위험한 방법으로, 안전하다는 보장이 없다.
사용 방법 예시 및 이해도 -
const_cast
클래스에서 const, volatile 및 __unaligned 특성을 제거합니다. 라고 msdn에 쓰여있다.
이런 소소한 사용도 가능하다.
http://prostars.net/53
이 곳의 글을 읽는 것이 좋은듯 하다.
static_cast
static_cast<int>(변수명);과 같이 사용한다.
자식 타입으로 부모 객체를 대입받으려 하면 컴파일러가 변환할 수 없다며 오류를 띄운다.
이때 static_cast를 사용해주면 변환이 되는데..
C형 명시적 캐스팅이면 끝난다.
그럼 대체 static_cast는 왜 쓰는 걸까?
char형에게 int형을 할당받게 하려는 문제를 C형 캐스팅은 그냥 넘어가버렸다. 그러나 static_cast는 곧장 오류를 띄워 잘못된 변환임을 알렸다.
이처럼 사용자의 몰지각한 변환을 막아주는 안전장치 역할을 한다.
static_cast는 C 스타일의 명시적 캐스팅처럼 명시적일 뿐더러, '안전' 하다.
dynamic_cast
dynamic_cast<int>(변수명);과 같이 사용한다.
방금 전 static_cast 예제때. 캐스팅하려면 static 혹은 dynamic 캐스트 연산자를 쓰라고 했었다. 그래서 한번 사용해보자!
결과는 에러!?
해당 클래스가 '다형 형식' 이 아니라고 난리를 친다.
그럼 이 다형 형식이란 건 뭘까?
위에서 . 이 연산자를 사용하려면 '하나 이상의 virtual 함수'가 존재해야한다. 라고 설명했었다. 바로 그것이 다형형식이다. virtual 함수. 즉 가상 함수는 오버라이딩을 통해 '다형성'을 구축한다. 자 그럼 virtual 함수를 만들어보자.
함수 하나 생겼을 뿐인데, 정상적으로 작동한다.
사실 이는 dynamic_cast가 상속관계에서 사용하기 위해 만들어진 연산자이므로 당연하다.
그런데, 이것이 정상적으로 작동하는 것일까?
dynamic_cast가 캐스팅해주는 것은, '객체를 읽어들이는' 포인터나 참조자의 타입을 다운 캐스팅하는 것이지.. 객체를 변환하는 것이 아니다.
자 이게 무슨 소리인지 확인해보도록하자.
dynamic_cast는 '변환이 잘못된 경우'에 NULL을 던진다.
실제로.. 내용을 실행해보면 함수 대신에 오류가 반겨준다.
이는 C형 명시적 캐스팅을 한 것과는 뭔가 판이하게 다른 상황이다.
C 형으로 명시적 캐스팅을 하면 이와 같다.
무척 잘 돌아간다. 그렇다면 대체 왜 dynamic_cast를 써야하는 지 애매해진다.
만약 '부모 타입의 포인터'로 '자식 객체'를 가리키고 있다가. 그것을 '자식 타입의 포인터'가 받게 하면 어떻게 될까?
이처럼 에러가 난다. 이 럴때 사용해주면?
reinterpret_cast
사용법은 위의 다른 함수와 다르지 않다.
하지만 retinerpret_cast는 마치, 홈쇼핑에서 광고하는 만능 물건들 같다. 만능 ~~ 이 본드만 있으면 모든 게 척척.. 하는 식으로 말이다. 각설하고 내용을 보자.
int a에, double의 포인터를 대입하거나 혹은 그 반대는 누가 보아도 비 정상적이다. int와 double형 사이의 변환이라면 약간의 데이터 손실을 포함해도 정상참작의 여지가 있지만 이건 전혀없다!
그런데 reinterpret_cast는 된다. 상관도 하지 않는다!
이게 무슨 신박한 일인가 하면....
reinterpret_cast를 사용하면, 데이터를 비트 단위로 그대로 때려넣게 된다.
포인터 안에 들어 있느 값을 정수로출력했더니 int a의 값과 똑같은 값이 나온다.
하지만.. reinterpret_cast는 무척 안전하지 않은데,
그것은 당장 %d 출력인 b를, %d , *b로 만 바꾸어보아도 알 수 있다. 실행하자마자 컴파일러가 오류를 일으키는 것을 볼 수 있다.
장단점 및 비교 -
장단점이라고 이거다하고 찝어서 말하기가 애매하다.
첨부 자료 -
참고한 주소 및 정보 -
// 좋은 블로그. 꼭 가보길 권장
http://prostars.net/55
'프로그래밍 > C, C++' 카테고리의 다른 글
반복자 무효화 현상 (0) | 2015.04.06 |
---|---|
RTTI (0) | 2015.03.31 |
C++ 캐스트(static_cast / const_cast / dynamic_cast / reintrpret_cast) (0) | 2015.03.30 |
virtual 키워드 (가상 함수 / 순수 가상 함수 / 가상 함수 포인터) (0) | 2015.03.30 |
void 포인터의 delete의 소멸자 호출 (0) | 2015.03.30 |
inline 함수 (0) | 2015.03.29 |
댓글을 달아 주세요