프로그래머/CPP_강의정리

cpp casting의 4가지 방법

미역국마싯 2021. 9. 27. 15:35

이때까지 우리는 캐스팅을 명시적으로 할 때 (int)방식을 사용했다. 이는 c언어의 특성이며 cpp은 다른 캐스팅 방식을 가지고 있다.

따라서 이제부터 알아볼 casting 방식을 cpp을 사용할 때 이용하도록 하자.

 

class Player
{
public:
	virtual ~Player() { }
};
class Knight : public Player
{

};
class Archer : public Player
{

};
class Dog
{

};

void PrintName(char* str)
{
	cout << str << endl;
}

static_cast

캐스팅할 때 가장 많이 사용되는 캐스팅 방법이다.

상식적인 캐스팅만 허용한다. 이때 상식적인 것은 int와 float의 타입 변환이나 다운 캐스팅(부모 -> 자식 클래스로 변환)같은 변환을 말한다.

int hp = 100;
int maxHp = 200;
float ratio = static_cast<float>(hp) / maxHp;	// == (float)hp

Player* p = new Knight();
Knight* k = static_cast<Knight>(p);

 

 

dynamic_cast

상속 관계에서의 안전한 형 변환을 지원한다.

다형성(RTTI : Run Time Type Information)을 이용한다. 다형성은 virtual 함수를 이용한다. virtual 함수를 부모 클래스 내부에 하나라도 만들면, 객체의 메모리에 가상 함수 테이블(vftable) 주소가 기입된다. 부모 클래스의 소멸자는 항상 virtual을 붙이는게 좋다.

Knight* k2 = dynamic_cast<Knight*>(p);

여기서는 p의 원본을 vftable에서 확인한 후 Knight 형이 아니면 nullptr을 반환하고, 맞으면 캐스팅 해준다.

중요한 점은 잘못된 타입으로 캐스팅을 했으면 nullptr을 반환한다는 것이다.

Player* p2 = new Archer();
Knight* k2 = dynamic_cast<Knight*>(p2);

Archer 클래스의 주소를 가지고 있는 p2를 Knight*형으로 변환하는 것은 잘못됐기 때문에 k2는 nullptr을 가리킨다.

 

 

여기서부터는 프로그래머 인생에서 거의 사용할 일 없는 캐스팅 방법이지만, 면접에서 나올 가능성이 크기 때문에 알아두자!!

const_cast

const를 붙이거나 땔 때 이용한다.

PrintName(const_cast<char*>("Kim"));

"Kim"은 const형 char이다. 즉, 읽을 수만 있는 데이터다. 따라서 const를 빼서 넘겨줘야 통과된다.

 

reinterpret_cast

가장 위험하고 강력한 캐스팅 방법이다(re-interpret : 다시 - 간주하다/생각하다)

포인터랑 전혀 관계없는 다른 타입으로 변환할 때 이용한다.

__int64 address = reinterpret_cast<__int64>(k2);

void* ptr = malloc(100);
Dog* dog = reinterpret_cast<Dog*>(ptr);

 

 

출처

https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard

 

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의

시리즈를 원활하게 학습하기 위한 기초적인 C++ 문법들에 대해 학습합니다. 어셈블리 언어부터 시작해서 기본 C++ 문법, STL, C++11까지 핵심적인 내용을 압축해서 다루게 됩니다., - 강의 소개 | 인

www.inflearn.com

 

'프로그래머 > CPP_강의정리' 카테고리의 다른 글

cpp 함수 포인터  (0) 2021.10.06
cpp 디버깅 기초  (0) 2021.09.28
cpp 얕은 복사와 깊은 복사  (0) 2021.09.23
cpp 타입 변환  (0) 2021.09.23
cpp 동적 할당과 인자로 받는 클래스 주의점  (0) 2021.09.20