C++에서 형변환(type casting)

C++에는 *_cast 형태의 여러 형변환 함수가 있다. 가능한 형변환이 없는 코드를 짜는 게 좋다고 하지만 불가피한 경우들이 있다. 형변환 함수가 많다보니 언제 어떤 형변환 함수를 써야하는지 혼동스러울 수 있다. 각 형변환에 대해 간단히 정리해보자.

C++에는 네 개의 형변환 함수가 있다. static_cast, dynamic_cast, reinterpret_cast, const_cast가 그것이다. 이 중 static_cast와 dynamic_cast를 가장 많이 사용하고, const_cast를 어느 정도, reinterpret_cast는 거의 쓰지 않는다.

클래스 포인터를 형변환할 때 기본적으로 dynamic_cast를 사용하고 dynamic_cast를 쓸 수 없는 경우에 static_cast를 사용한다. dynamic_cast는 실행 시간에 객체의 타입 정보를 참조하여 형변환하기 때문에 다형성(polymorphic)을 가지지 않은 객체는 변환할 수 없다. 가상 멤버를 가진 클래스에는 dynamic_cast를, 가상 멤버가 없는 클래스에는 static_cast를 사용하자. 가상 멤버를 가지고 있는 경우에도 static_cast를 사용할 수 있지만 안전하지 않으므로 안쓰는 게 좋다. 그리고 dynamic_cast는 형변환에 실패하면 0을 리턴하기 때문에 실행 중에 체크할 수 있다.

const 객체의 const 특성을 없애고 싶을 때는 const_cast를 사용한다. 하지만 객체를 최초로 생성할 때 const 특성을 부여한 경우에는 const_cast의 동작을 보장할 수 없다. 쓰지 말아라.

reinterpret_cast는 전혀 관계 없는 형간의 변환에 쓰인다. 예를 들어 char* p = reinterpret_cast<char*>(0xEF000000)과 같은 식으로 임의의 값을 주소로 바꿀 때 쓴다. 이는 임베디드 프로그래밍에서 하드웨어 주소를 변수에 맵핑해서 다루는 방식이다. 일반 응용 프로그램에서는 거의 쓸 일이 없을 것이다.

참고 문헌

Stroustrup, The C++ Programming Language, special edition, Addison Wesley, 2000

Leave a Reply