C++ 클래스와 관련된 형변환

왜 C++ 스타일의 형변환을 배워야 할까?
(int)variable - C 스타일의 형변환
위 형변환에는 2가지 문제점이 있습니다.
첫째, C 스타일의 형변환은 눈에 잘 띄지도 않고 툴을 사용해서 찾기도 힘듭니다. 괄호를 사용하는 부분은 형변환 말고도 굉장히 많습니다. 그렇기에 더욱 구별이 안 되는 것입니다.
둘째, 형변환의 의도를 구별하기 힘듭니다. C++ 스타일의 형변환은 경우에 따라 4가지로 나뉘게 되어 코드를 읽는 사람이 형변환의 의도를 알 수 있도록 합니다.

1. const_cast - const 속성이나 volatile 속성을 제거할 때 사용

const int ci = 100;
int i = const_cast<int>(ci);

위 코드에서는 const 키워드가 붙은 ci를 const가 붙지 않은 int형태로 바꿔줍니다.

2. reinterpret_cast - 일반적으로 허용하지 않는 위험한 형변환에 사용

int a, b;
a = reinterpret_cast<int>(&b);

위 코드와 같이 reinterpret_cast는 포인터를 정수로 변환하는 등의 작업에 사용됩니다. 개발을 하다보면 이런 강제적인 형변환을 마주치게 될텐데, 위험 부담은 개발자의 몫입니다.

3. static_cast - 일반적인 형태의 형변환에 사용

double d=30.0;
char c;
c=static_cast<char>(d);

static_cast는 명시적인 형변환이기는 하지만 대체적으로 안전한 형변환이라고 할 수 있습니다. 이 형변환은 다음과 같은 공식을 따르며 형변환됩니다.

만약, A 타입에서 B 타입으로의 암시적인 형변환이 가능하다면 static_cast를 사용해서 B 타입에서 A 타입으로 형변환할 수 있다.

4. dynamic_cast - 서로 상속 관계에 있는 클래스간의 형변환에 사용

class A
{
public:
     virtual void Func();
};

class B:public A
{
};

int main()
{
     A *pa = new C;
     C *pc = dynamic_cast<C *>(pa);
     return 0;
}

형변환에 문제가 있는 경우에는  이 연산자는 NULL 값을 반환하거나 bad_cast 예외를 던집니다.


댓글