Nagie's DevStory
[CPP] 37. C++ 스타일 형변환(C++ Style Type Cast) 본문
C++에서 C 스타일의 형변환을 사용할 수 있지만 권장하지는 않는다.
보기엔 조금 복잡해 보일 수는 있지만 C++에서 제공하는 형변환 연산자를 사용하는 게 권장되며
총 4가지 형변환 연산자가 있다.
1. static_cast
'static_cast'는 C++에서 보편적으로 사용되는 형변환 연산자로
컴파일러가 자동으로 변환할 수 있는 형식 간의 형변환을 해준다.
간단하게 정수를 실수로 변환하거나 서브 클래스 포인터를 슈퍼클래스 포인터로 변환할 때 사용된다.
//static_cast의 사용법
int integerNumber = 42;
double doubleNumber = static_cast<double>(integerNumber);
2. dynamic_cast
'dynamic_cast'는 주로 다형성을 다룰 때 사용되며, 안전한 형변환을 수행하게 되는데
런타임에 실제 객체의 유형을 확인하고 형변환을 하기에 프로그램의 성능 하락을 감수하고 써야 하며
'dynamic_cast'가 코드에 등장하게 되었다면 상황이 영 좋지 못한 쪽으로 흐르고 있다고 생각해야 한다.
//dynamic_cast의 사용법
Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {
// 안전하게 형변환 수행
}
3. const_cast
'const_cast'는 'const'한정자를 추가하거나 제거하는 데 사용된다.
주로 포인터나 참조를 통해 변수를 수정하기 위해 사용되지만, 사용에 신중해야 한다.
const를 지정해 놓은 이유는 대체로 그 값을 건들면 안 되기 때문에 지정하는 것이라
무턱대고 건들면 좋지 못한 결과가 생길 수도 있기 때문이다.
//const_cast 사용법
const int readOnlyValue = 10;
int& mutableValue = const_cast<int&>(readOnlyValue);
mutableValue = 20;
4. reinterpret_cast
'reinterpret_cast'는 다른 형식의 포인터를 변환하거나 다른 형식의 객체를 강제로 변환할 때 사용된다.
이 연산자는 매우 매우 주의해서 사용해야 하며 일반적으로 하드웨어와 관련된 낮은 수준의 작업에 사용된다.
C에서 사용하던 형변환 연산자가 'reinterpret_cast'와 비슷하다.
//reinterpret_cast 사용법
int intValue = 42;
double* doublePtr = reinterpret_cast<double*>(&intValue);
C++ 스타일의 형변환을 사용하게 되면 코드의 가독성은 조금 희생할 수 있겠지만 형변환 오류를 크게 줄일 수 있다.