설명 -

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로 만 바꾸어보아도 알 수 있다. 실행하자마자 컴파일러가 오류를 일으키는 것을 볼 수 있다.



장단점 및 비교 -

장단점이라고 이거다하고 찝어서 말하기가 애매하다.


첨부 자료 -



C 캐스팅.zip




참고한 주소 및 정보 - 

// 좋은 블로그. 꼭 가보길 권장

http://prostars.net/55


Posted by GENESIS8

댓글을 달아 주세요