타입 변환 연산자
- C++언어에서 타입 변환을 하기 위해 제공되는 연산자.
- C언어에서는 아무 조건 없이 타입 변환이 가능해서, 변환하면 안되는 상황에서도 타입 변환이 되어 많은 문제가 발생.
- C언어의 타입 변환 문제를 해결하기 위해 C++에서 4가지 타입 변환 연산자를 제공.
! 타입 변환을 할 때는 항상 올바른 타입 변환인지 확인해서 메모리 오염이 발생하지 않도록 해야함.
static_cast
- 가장 기본적인 타입 변환 연산자.
- 상식적으로 가능한 타입 변환만 허용.
- 상식적인게 꼭 맞다는 말은 아님.
- 4가지 타입 변환 연산자 중 80~90% 사용률 차지
ex) int <-> float, 부모 클래스 -> 자식 클래스 (down cast)
예제 코드
#include <iostream>
using namespace std;
class Player
{
public:
int _hp = 100;
};
class Knight : public Player
{
public:
int _str = 50;
};
int main()
{
int a = 1;
int b = 2;
float c = static_cast<float>(a) / 2;
Player* p = new Knight();
Knight* k = static_cast<Knight*>(new Player());
return 0;
}
dynamic_cast
- 상속 관계에서 사용하며, 다형성을 이용하여 안전한 타입 변환 수행.
- 클래스에 가상 함수가 1개 이상 포함되어 있어야 사용 가능. (대부분 소멸자를 가상 함수로 사용)
- RTTI(Run Time Type Information) 사용. (런타임에 타입 정보를 확인)
- 잘못된 타입 변환을 수행한 경우, nullptr 반환.
- 맞는 타입으로 캐스팅 했는지 확인하는데 유용함.
- RTTI를 활용해서 확인하는 과정이 있으므로, static_cast 보다 속도가 느림.
예제 코드
#include <iostream>
using namespace std;
class Player
{
public:
virtual ~Player() {}
public:
int _hp = 100;
};
class Knight : public Player
{
public:
int _str = 50;
};
int main()
{
Knight* k = dynamic_cast<Knight*>(new Player());
return 0;
}
const_cast
- 상수 자료형(const)의 const를 없애거나 추가할 때 사용.
- 상수 자료형은 상수로 사용하려고 만든건데, 이거 쓸거면 그냥 처음부터 변수로 만드는게..
- 거의 사용하지 않음.
reinterpret_cast
- 가장 위험하고 강력한 타입 변환 연산자.
- 전혀 관계없는 타입 변환 가능.
예제 코드
#include <iostream>
using namespace std;
class Player
{
public:
virtual ~Player() {}
public:
int _hp = 100;
};
class Knight : public Player
{
public:
int _str = 50;
};
int main()
{
Knight* k = new Knight();
__int64 address = reinterpret_cast<__int64>(k);
return 0;
}