캐스트 : 형변환
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); // 됩니다.
캐스트를 알아보았는데,
되도록이면 안쓰는걸 추천합니다
잘못된 결과가 나오기도하고, 이식성에도 좋지 않기 때문입니다.
'Programming Language > C, C++' 카테고리의 다른 글
디버깅용 __LINE__, __FILE__ 등등 (0) | 2014.05.13 |
---|---|
반올림 매크로 - C++ (0) | 2014.05.13 |
LPCTSTR, TCHAR, char (0) | 2014.05.13 |
struct, typedef (0) | 2014.05.13 |
C++ TR1 설치 (0) | 2014.05.13 |