C++ 에는 4가지의 캐스팅이 있습니다. 그 캐스팅을 공부해봅시다.
캐스팅은 자료형간 또는 포인터간 형변환시 사용됩니다.
캐스팅은 크게 묵시적 캐스팅와 명시적 캐스팅 두 가지로 나눌 수 있습니다.
특별히 캐스팅 연산자를 사용하지 않고 이루어지는 경우를 묵시적 캐스팅이라고 합니다.
static_cast
static_cast 의 특성은 묵시적 캐스팅와 일치적으로 같다고 보면 됩니다.
묵시적 캐스팅에는 컴파일 시점에서 무결성 검사를 하는데 이떄 허용 과 컴파일러에 의한 값 변환 이라는 두 가지 관점에서 이루어 집니다.
컴파일 타임에서 제약사항은 에러를 발생시킵니다. static_cast는 형변환에 대한 타입체크를 run time 에 하지않고 compile 타임에 정적으로 수행합니다.
#include<iostream>
using namespace std;
class Car
{
public :
virtual void Open()
{
cout << "차문 개방" << endl;
}
};
class BasicCar : public Car
{
public:
void Open()
{
cout << "옆으로 열림" << endl;
}
};
class SuperCar : public Car
{
public:
void Open()
{
cout << "위로 열림" << endl;
}
};
int main()
{
Car* p = new Car();
BasicCar* B = new BasicCar();
p = static_cast<Car*>(B);
p->Open();
}
const_cast
상수를 없애는 데 사용합니다.
int main()
{
const int a = 5;
a = 6; // 에러
int* c = const_cast<int*>(&a);
*c = 7; // 가능
}
reinterpret_cast
reinterpret_cast는 어떠한 포인터 타입으로 변환이 가능합니다.
어떠한 정수 타입도 어떠한 포인터 타입으로 변환이 가능하고, 그 역으로도 가능합니다.
char*->int 또는 int*에서 char* 로 변환이 가능합니다. 하지만 매우 위험부담이 큼니다.
강제로 형변환하는것은 어떠한 결과를 초래할지 모르기때문에 매우 위험합니다.
바이트 단위로 뭉텅이로 변환을 시도하기 떄문입니다.
dynamic_cast
dynamic_cast는 run time(동적으로)에 상속 계층 관계를 가로지르거나 다운캐스팅시 사용되는 캐스팅 연산자입니다.
기본 클래스 객체에 대한 포인터나 레퍼런스의 타입을 자식 클래스, 혹은 형제 클래스의 타입으로 변환 할 수 있습니다.
캐스팅의 실패시 NULL 혹은 nullptr 이 들어옵니다.
상속 관계는 있지만 만약 virtual 맴버 함수가 하나도 없다면 다형성을 가진게 아니라 단형성이며, dynamic_cast는
다형성을 띄지않은 객체간 변환은 불가능하며, 컴파일 에러를 발생합니다.
또한 RTTI에 매우 의존적으로 변환 비용이 매우 하드합니다.
#include<iostream>
using namespace std;
class Car
{
public :
virtual void Open()
{
cout << "차문 개방" << endl;
}
};
class BasicCar : public Car
{
public:
void Open()
{
cout << "옆으로 열림" << endl;
}
};
class SuperCar : public Car
{
public:
void Open()
{
cout << "위로 열림" << endl;
}
};
int main()
{
Car* C = new BasicCar();
BasicCar* B = dynamic_cast<BasicCar*>(C);
if (B)
{
B->Open();
}
}
여기서 포인터 변수는 부모인 Car로 잡고 가르키는 즉 동적할당을해주는 것은 BasicCar()로 해줬는데 이유는
dynamic_cast를 하기위해 BasicCar에 생성자를 한번 호출해야하기 떄문입니다.
'개발자 면접 공부 > C-C++' 카테고리의 다른 글
(C,C++) L-Value, R-Value (0) | 2022.08.02 |
---|---|
C++ 스마트 포인터(Unique, Shared, Weak) (0) | 2022.07.19 |
C++ RTTI 에 대해 (0) | 2022.07.14 |
C++ 순수 가상 함수(추상 클래스) (0) | 2022.07.12 |
C++ Virtual(가상) 함수 (0) | 2022.07.12 |