본문 바로가기

강의자료/C/C++

TIP. C++ 스타일 캐스팅


C언어에서는 캐스팅을 다음과 같이 하였습니다.

(타입) 표현식

C++에서는 다음과 같은 형식을 사용하도록 유도하고 있습니다.

static_cast<타입> (표현식)

한가지 예를 들어 봅시다.

int num1 = 2101, num2 = 104;
double result = ((double)num1)/num2;    // C언어 스타일 캐스팅.
double result = static_case<double>(num1)/num2    // C++ 스타일 캐스팅.

코드로 작성하기에는 좀 더 불편해졌지만 한눈에 보더라도 캐스팅하고 있음을 알 수 있도록 변경되었습니다. 솔직히 C언어 스타일의 캐스팅은 캐스팅하고 있는건지 코드를 보면서 한눈에 들어오지는 않았습니다.

하지만 C++ 스타일의 캐스팅은 총 4가지가 있습니다. 각각에 대해서 간단하게 알아보도록 하겠습니다. 사용법은 4가지 모두 동일합니다.

# static_cast : C언어 스타일의 캐스팅과 같은 기본적인 형변환 연산자입니다.
# const_cast : 표현식의 상수성이나 휘발성(volatileness)을 없애는 용도로만 사용됩니다.
# dynamic_cast : 상속 계층 구조를 변환하는 용도로만 사용됩니다.
# reinterpret_cast : 포인터 타입을 바꾸는 용도로만 사용됩니다.


기타 다른 캐스팅의 자세한 사용법은 나중에 알아보기로 하고 마지막 reinterpret_cast에 대해서만 좀 더 알아보겠습니다.

typedef void (*FunctionPointer)();    // 인자와 반환값이 모두 없는 함수 포인터.

int DisplayGame();                        // 일반함수.

FunctionPointer Display;                 // 함수포인터를 입력받을 변수.

Display = &DisplayGame;                                                  // 에러. 타입 불일치.
Display = reinterpret_cast<FuctionPointer>(&DisplayGame);  // 통과.

위와 같이 포인터의 타입을 바꾸는데 reinterpret_cast를 사용할 수 있습니다.