VS 2010/C++

cast 형변환 (ex : const char -> char)

mind10 2014. 6. 13. 11:55

캐스트 : 형변환

C++스타일의 캐스트는 reinterpret_cast, static_cast, const_cast, dynamic_cast 등이 있다.

 

쉽게 말해 C 스타일의 캐스트는 식별자를 그냥 괄호로 둘러 싼 그것

float a = 1.23;

int b = (int)a;

이게 바로 C스타일의 캐스트, 즉 형변환

이렇게 써놓으면 눈으로 찾기도 힘들고 내부적으로도 코드가 더러워지는 등 불편함이 있다고 합니다.

 

그런데 C++스타일의 캐스트는

static_cast<타입>(표현식)

이런식으로 작성됩니다.

 

예를들면,

int형을 double형인것 처럼 결과를 내고싶어 그렇다면 C스타일로는

int a, b;

double result = ((double) a) / b;

요런식이겠지요

 

그런데 C++스타일의 캐스트를 적용하면

double result = static_cast<double>(a) / b;

이런 스타일로 적용됩니다.

이러면 가독성이 높아집니다, 왜냐하면, static_cast 부분은 파란색으로 나오기 때문입니다,

아니 그건 그렇다쳐도 컴파일러도 내부적으로 저 부분이 인식이 더 잘된다고 합니다.

 

static_cast

기본적으로 C스타일의 캐스트와 같은 역할

그래서 double을 포인터로 바꾼다던지 int를 struct로 바꾼다던지 하는 일은 하지 못합니다.

 

const_cast

이것은 상수성(const)이나 휘발성(volatile)을 떼버리는데 사용되는 캐스트입니다.

const로 선언된 것을 제거하는데 쓰입니다

예를들면,

int update(int *a);

int b;

const & cb = b;  // cb는 b를 상수객체 인것처럼 참조합니다

update(&cb);     // 에라!! 상수라서 안돼

update(const_cast<int*>(&cb));   // 상수성을 제거해서 되는거야


 

dynamic_cast

얘는 상속계층 관계를 가로지르거나, 하향시킨 클래스 타입으로 안전하게 캐스팅 할 때 사용

기본 클래스의 객체에 대한 포인터나 참조자의 타입을 파생클래스나 형제클래스 타입으로 형 변환해주는 것

걍 예제를 보아요

class Widget {.....};                                    // 위젯 클래스

class SpecialWidget : public Widget {.....};    // 위젯의 하위클래스

void update(SpecialWidget *psw)

Widget *pw;

update(dynamic_cast<SpecialWidget*>(pw));  // 이상 없음 하위클래스의 형태로 형변환


당연한 얘기지만 dynamic_cast는 상수성을 제거하는데에는 사용될 수 없습니다

 

reinterpret_cast

얘가 정의되어 있는 코드는 컴파일러에 따라 다르게 정의되어 있기 때문에 왠만하면 쓰지 않는 편이 좋겠습니다.

함수 포인터 타입을 바꾸는데 사용되는데, 

예를들면,

typedef void (*FuncPtr)();  // 인자 안받고, void를 반환하는 함수에 대한 포인터

FuncPtr funcPtrArray[10];  // funcPtrArray는 10개의 FuncPtr로 이루어진 배열

이런 상횡에서 어쩔 수 없이 다음 함수에 대한 포인터를 넣어야할 사정이 생겼어요

int doSomething();

간단한 문제같지만 캐스트를 반드시 해 주어야 합니다.

왜냐, doSomething()은 funcPtrArray에 넣기엔 타입이 맞지 않아요

funcPtrArray는 void를 리턴하구 doSomething은 int를 리턴하니까요

funcPtrArray[0] = &doSomething;    // 걍에러 타입이 안맞습니다

funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);   // 됩니다.

ㅇㅋㅇㅋㅇㅋ?

 

캐스트를 알아보았는데,

되도록이면 안쓰는걸 추천합니다

잘못된 결과가 나오기도하고, 이식성에도 좋지 않기 때문입니다.