프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] 동적할당과 캐스팅 : C 스타일 캐스팅 과 캐스팅 4총사(37강, 42강)

순정법사 2023.09.14

A. C 스타일 캐스팅 (37강)

1. 일반적인 타입 변환

a. 값 타입 변환

🌟 의미를 유지하기 위해서 원본 객체와 다른 비트열 재구성

 

 

a와 b는 완전히 다른 주소값이 들어가게 됨 (원본 객체와 다른 비트열 재구성)

 

b. 참조 타입 변환

 

이렇게되면 이상한 값이 b에 들어가는데,

이유는 123456789의 주소값을(a) float& 형태로 변환하다보니 이상한 값으로 변환된것

평생 쓸 일 없음

 

c. 안전한 변환

 

의미가 100% 일치하는 경우

작은 메모리 ➡ 큰 메모리로 옮기는 경우 

 

d. 불안전한 변환 

의미가 일치하지 않는 경우

큰 메모리 ➡ 작은 메모리로 옮기는 경우 

 

e. 암시적 변환

컴파일러가 알아서 변환해주는 것 

 

 

 

2. 포인터끼리 캐스팅(클래스)

a. 참조가 되지 않은 클래스끼리 캐스팅

포인터끼리의 변환은 데이터가 바뀌진 않음. (메모리상으론 동일)

그 대신 그 포인터를 사용하면(멤버 변수를 변경하는 듯한 메모리 변경) 바뀌게 됨!

 

dog->age = 10는 Knight 메모리에서 일어나게 됨
위 코드는 이 이미지같이 설명가능함..

 

마치 이렇게 말도 안되는걸 주장하면 큰일이 난다는것을 보여주고 싶었다,,

👉 차후 재해석 캐스팅(reinterpret cast)이 됨

 

 

 


B. 캐스팅 4총사 (42강)

주로 정적, 동적 캐스트만 사용하고 나머지 캐스트는 특정 상황에서만 사용해야 함!

 

1. 정적 캐스트

a. static cast란?

🌟 static_cast 연산자를 사용해 데이터를 다른 데이터 유형으로 변환

 

  • 컴파일러가 형 변환을 허용하는 경우 사용
  • 주로 일반적인 형 변환에 사용함
  • 위에서 공부한 (A) C타입의 캐스팅 문법임

 

⏳ 예제 1 : 기본형끼리의 캐스팅

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

 

⏳ 예제 2 : 상속형끼리 캐스팅

Knight* k = new Knight();
Player* p = k;

Knight* k2 = p;	//에러
Knight* k2 = (Knight*)p;

//Knight가 Player를 상속하고 있는 경우

 

 

2. 동적 캐스트

a. dynamic cast란?

🌟 dynamic_cast 연산자를 사용해 상속 관계에서의 안전한 형 변환을 수행하는데 사용

 

  • 다형성과 함께 사용되고(virtual), 런타임에 유효성 검사를 수행함
  • 클래스간 상속 관계에서만 사용이 가능함
  • RTTI(RunTime Type Information)을 이용함
  • 💥 실행 속도가 정적 캐스트보다 느려서 성능이 중요시 되는 코드에서는 지양해야 함

 

⏳ 예제 : 기본적인 동적 캐스트 방식

class Base { /* ... */ };
class Derived : public Base { /* ... */ };

Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {
    // 유효한 형 변환
}

 

가상 함수의 낑겨넣은 정보를 이용하는 RTTI 방식을 이용하기 때문에

만약 옳지 않은 형변환을 하게 된다면 nullptr을 반환함

 

Archer* k = new Archer();
Player* p = k;
Knight* k2 = dynamic_cast<Knight*>(p);	//C# as문법
if(k2 != nullptr){
	//기사일때
}

 

 

3. 상수 캐스트

a. const_cast란?

🌟 const_cast 연산자는 변수 const 속성을 제거하거나 다시 추가하는데 사용

 

주로 포인터 또는 참조 변수에서 const 속성을 제거할 때 사용

 

const int x = 10;
int& y = const_cast<int&>(x);
y = 20; // x의 값을 변경

 

 

4. 재해석 캐스트

a. reinterpret_cast란?

🌟 reinterpret_cast 연산자는 데이터를 비트 수준에서 다른 데이터 유형으로 해석

 

주로 저수준 메모리 조작 또는 다른 데이터 유형간에 안전하지 않은 형 변환에 사용

즉, 포인터에서 전혀 관계없는 다른 타입 변환 

 

💥 주의해야 하고 오해의 소지가 없는 경우에만 사용해야 함

 

int value = 42;
double* ptr = reinterpret_cast<double*>(&value);

 

💙 사용하는 곳

 

1. 메모리를 할당해서 주소를 넣어줄 떄
2. 주소를 잠시 int값으로 받고 싶을 떄

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com