맨날 헷갈리는 C++캐스팅

출처는 우식형 홈페이지(여기). 원출처는 모름.

C++에는 새로운 타입 캐스팅 방법이 도입되었습니다.
static_cast, const_cast, reinterpret_cast, dynamic_cast
이렇게 네가지가 새로 생겼습니다.
마지막의 dynamic_cast는 완전 새로운 것이고,
앞의 세가지는 기존 C 방식이 기능에 따라 세가지로 나누어 졌다고
생각하시면 이해가 쉽습니다.

먼저, const_cast는 const 포인터에서 const를 제거할 때 사용합니다.
const int* pa;
int* pb = const_cast(pa);

reinterpret_cast 는 전혀 관계없는 타입끼리의 캐스팅에 사용합니다.
주로 void* 를 원하는 타입으로 바꾼다던지 할때 많이 씁니다.
void* p = malloc(4 * sizeof(int));
int* pnum = reinterpret_cast(p);

그에 대부분의 C 형태 캐스팅은 static_cast에 해당합니다.
숫자 타입끼리의 변경이나 클래스 상속끼리의 캐스팅등입니다.
float a = 3.0;
int b = static_cast(a);

dynamic_cast 는 베이스 클래스 포인터를 하위(sub) 클래스 포인터로 캐스팅
할 때 사용할 수 있는데, 이때 static_cast 와 다른 점은 이름에서도
알 수 있듯이 실행시 실제 인스턴스의 타입을 검사해서 캐스팅 가능하면
그 타입의 포인터를 리턴하고, 실패하면 NULL을 리턴합니다.
실행시 검사하기 때문에 오버헤드가 커서 잘 안쓰입니다.
그리고 사용하지 않아도 되도록 프로그램을 짜는 것이 더 좋습니다.

이렇게 기능별로 나눈 이유는 타입 캐스팅이 버그등 많은 문제를 일으킬
가능성이 높은 것이라서 정확하게 사용하기 위한 안전장치라고 보시면 됩니다.
필요할 때, 필요한 만큼만 알고 쓰자라는 것입니다.
따라서 새로운 C++ 의 캐스팅 방법을 사용하는 것이 좋은 습관입니다.

const_cast 는 용도가 확실하니 제외하고,
일단 static_cast를 먼저 써 보고 컴파일러가 안된다고 에러를 내면
미안하다고 말하고(-,.-;) reinterpret_cast를 사용하세요.

사실 몇가지만 조심하면 캐스팅할 일도 별로 없긴하다.

“맨날 헷갈리는 C++캐스팅”에 대한 2개의 댓글

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다