[C++] 객체 지향 프로그래밍 - 타입 변환 연산자

Taeil Nam·2022년 11월 4일
0

C++

목록 보기
10/13
post-thumbnail

타입 변환 연산자

  • 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; // int -> float 타입으로 변환하여 실수 계산 수행.
	
	// 자식 클래스(Knight) -> 부모 클래스(Player) 타입 변환 = up cast = 원래 가능.
	Player* p = new Knight();

	// 부모 클래스(Player) -> 자식 클래스(Knight) 타입 변환 = down cast = 원래는 안되지만, 상식적으로 허용.
	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()); // dynamic_cast 사용.
    
	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); // reinterpret_cast를 사용하여 포인터 타입과 정수 타입간 타입 변환 수행.

	return 0;
}

0개의 댓글