보기도 쉽지 않고, 한번도 사용 안해봤던 C++의 여러 캐스트 연산자들. 언제나 C 스타일의 캐스트 연산자만 써왔는데, 당장 알아야 하는 것은 아니지만, 내친김에 한번 훌터보고 가는 것이 좋을거 같다. 기왕 사용하는 거, 좀 제대로 알고 사용하는 것이 좋지 않겠나..으흐.. 그놈의 면접 질문 파장, 정말 오래도 간다..
캐스트(cast)란 명시적 변환(explicit conversion)을 의미한다. C++의 캐스트 연산자는 4가지인데, 이들은 C++의 타입 체킹 기능을 약화 혹은 마비시키기 때문에, 조심해서 사용해야 할 것이다.
캐스트를 이용하는 경우
•
void* 포인터 형태의 인스턴스에 명시적으로 타입을 지정해야 할 때.
•
일반적 표준 변환의 동작을 오버라이드해야 할 경우.
double dval;
int ival;
ival += dval; //여기서 ival은 double로 승격되었다가, 덧셈이후, 대입 과정에서 int로 격하된다.
ival += static_cast< int > ( dval ); //승격 과정이 없어진다.
C++
복사
•
한번 이상의 변환이 일어나는 경우의 상황에서 모호성을 없애기 위해서..(나도 몬소린지 모르겠다..별로 안중요한거 같아..넘어간다..으흐..)
C++의 캐스트 연산자
•
static_cast: 컴파일러가 명시적으로 수행하는 모든 타입 변환에 사용. 타입 격하시, 컴파일러로 하여금 격하(demotion)하고 있다는 것을 분명히 알려, 경고 메시지가 안뜨도록 만든다. (잠재적 위험을 갖는 변환 : 산술 값을 enum 타입으로 캐스트할 경우, 기반 클래스를 파생 클래스로 캐스트할 경우 -> dynamic_cast 사용)
•
const_cast: 캐스트 할 표현식에 담긴 const 속성이나 volatile 속성을 없앨 때 사용. 이 연산자를 일반 변환에 사용하면 컴파일 오류가 발생하고, 그 반대도 마찬가지이다.
•
reinterpret_cast: 자신의 피연산자에 대한 비트 패턴에 대해 하위 수준(low-level)의 재해석을 실시. 위험 수준 최고의 캐스트
complex *pcom;
char *pc = reinterpret_cast( char* > (pcom);
//이 경우, pc는 char*으로 온전하게 변환되지만, 꽤나 조심해야되는 것이,
string str( pc );
//처럼 나중에 사용될 경우, 컴파일 타임 오류 발생없이 그대로 실행되고,
//그 실행 결과는 어떻게 될지 장담할 수가 없게 된다. 사용 조심~!
C++
복사
•
C++이 C 스타일의 캐스트 연산자를 지원함에도 불구하고, Stroustrup이 이처럼 4가지의 캐스트 연산자를 따로 구분해놓은 이유는, 캐스트 연산자는 위험스러운 연산자임에 반해, 그 위험성을 프로그래머가 제대로 파악하기 힘들겠다 싶어서, 이처럼 따로 나눈 것이라나… 이렇게 하면 적어도 캐스트가 적용될 범위를 프로그래머가 재대로 인식할 수 있지 않겠냐...하는 생각에서 나왔다고.
참고 자료
•
C++ Primer(Stan Lippman저, Addison Wesley)
•
C++ Primer Plus(Stephen Prata저, Sams)