[Basic C++] #30_캐스팅, const_cast, static_cast, dynamic_cast
C++ 개발에서 까다로운 문법 혹은 특별한 의미를 갖는 부분에 대해 알아보겠습니다.
"전문가를 위한 C"의 10 항목, "C++의 까다롭고 유별난 부분들"에 해당하는 내용입니다.
Overview
- 개념
- const_cast
- static_cast
- dynamic_cast
#0. 개념
1. 캐스팅?
- C++에서 우리는 C와 동일하게 괄호를 이용한 캐스팅을 사용할 수 있습니다.
- 하지만, C++는 부가적으로 네 가지 새로운 방법을 제시합니다 - const_cast, static_cast, dynamic_cast, 그리고 reinterpret_cast. 이 네 가지 캐스팅 방법은 더 많은 타입 검사를 하며, 문법적으로 더 안전합니다.
- 이번 글에서 우리는 "const_cast", "static_cast", 그리고 "dynamic_cast"에 대해서 알아보겠습니다.
#1. const_cast(상수성 제거)
1. const_cast?
extern void ThirdPartyLibraryMethod(char* str);
void f (const char* s)
{
ThirdPartyLibraryMethod(const_cast<char*>str); // const_cast를 통해 상수성 제거
}
Details
- const_cast는 상수 변수의 상수 성을 제거합니다.
- 쉽게 말해서 const 키워드를 통해 상수로 미리 설정해둔 변수를 추후에 일반 변수처럼 활용하기 위함입니다.
- 이때, 초기 목적을 유지하기 위해 변수 값의 변경을 주의해야 합니다.
#2. static_cast(타입 캐스팅)
1. static_cast?
int i = 3;
int j = 5;
double res = static_cast<double>(i) / j; // int 변수를 double로 타입캐스팅
/************************************/
class Super
{ ... };
class Sub : public Super
: Super()
{ ... };
int main()
{
Super* mySuper;
Sub* mySub;
mySub = new Sub();
mySub = static_cast<Sub*> (mySuper);
return;
}
Details
- static_cast는 가장 일반적인 타입 캐스팅으로 활용됩니다.
- 더불어, 클래스 계층 구조에서 하위 계층으로 다운 캐스팅하기 위해 static_cast가 사용됩니다. 물론 참조형에도 사용 가능하겠죠.
- 하지만, static_cast는 런타임 검사가 수행되지 않습니다.
- 계층 구조가 런타임에도 유효한지 검사하지 않기 때문에, 예상 밖의 오류가 발생할 수 있으므로 주의해야 합니다.
- 하나 더! const 타입의 상수성 제거 혹은 포인터 타입을 일반 타입으로 캐스팅하는 등 비상식적인 캐스팅 또한 허용되지 않으므로 이 부분도 주의해야 합니다.
#3. dynamic_cast(런타입 타입 정보 검사)
1. dynamic_cast?
class Super
{ ... };
class Sub : public Super
{ ... };
int main()
{
Super* mySuper;
Sub* mySub = new Sub();
mySuper = mySub;
mySub = dynamic_cast<Sub*>(mySuper); // dynamic_cast 사용
}
Details
- dynamic_cast는 클래스 계층에 대한 런타임 타입 정보 검사를 수행합니다.
- 이 검사를 통해, 해당 계층 변환이 적합한지 확인합니다.
- 이때, dynamic_cast를 사용하고자 하는 클래스 내부에 virtual 메서드가 꼭 필요합니다.
- 왜냐하면, 런타임 타입 정보가 저장되는 곳이 객체의 "vtable"이며, 클래스에 하나 이상의 가상 메서드가 필수적입니다.
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #31-2_STL 컨테이너, vector, list, deque, set, map (0) | 2022.05.30 |
---|---|
[Basic C++] #31-1_STL, C++ 표준 라이브러리 (0) | 2022.05.30 |
[Basic C++] #29_typedef (0) | 2022.05.22 |
[Basic C++] #27_상수 표현식, constexpr (0) | 2022.05.21 |
[Basic C++] #26_const 포인터, const 참조 (0) | 2022.05.15 |