본문 바로가기

Native/C++

static_cast<int>(변수)랑 (int)변수 dynamic_cast reinterpret_cast

일단 C++에서도 C와 마찬가지 방법의 타입 캐스팅이 가능하고요, C++에는 새로운 타입 캐스팅 방법이 도입되었습니다.

[code]
static_cast, const_cast, reinterpret_cast, dynamic_cast
[/code]

이렇게 네가지가 새로 생겼습니다. 마지막의 dynamic_cast는 완전 새로운 것이고, 앞의 세가지는 기존 C 방식이 기능에 따라 세가지로 나누어 졌다고 생각하시면 이해가 쉽습니다.

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

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

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

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

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

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

'Native > C++' 카테고리의 다른 글

map 사용 예  (0) 2013.10.02
& 연산자 (참조)  (0) 2013.10.02
.net 에서 cout 이 안될때..  (0) 2013.10.02
상수 멤버  (0) 2013.10.02
정적 멤버변수 이용  (0) 2013.10.02