A. C 스타일 캐스팅 (37강)
1. 일반적인 타입 변환
a. 값 타입 변환
🌟 의미를 유지하기 위해서 원본 객체와 다른 비트열 재구성
a와 b는 완전히 다른 주소값이 들어가게 됨 (원본 객체와 다른 비트열 재구성)
b. 참조 타입 변환
이렇게되면 이상한 값이 b에 들어가는데,
이유는 123456789의 주소값을(a) float& 형태로 변환하다보니 이상한 값으로 변환된것
평생 쓸 일 없음
c. 안전한 변환
의미가 100% 일치하는 경우
작은 메모리 ➡ 큰 메모리로 옮기는 경우
d. 불안전한 변환
의미가 일치하지 않는 경우
큰 메모리 ➡ 작은 메모리로 옮기는 경우
e. 암시적 변환
컴파일러가 알아서 변환해주는 것
2. 포인터끼리 캐스팅(클래스)
a. 참조가 되지 않은 클래스끼리 캐스팅
포인터끼리의 변환은 데이터가 바뀌진 않음. (메모리상으론 동일)
그 대신 그 포인터를 사용하면(멤버 변수를 변경하는 듯한 메모리 변경) 바뀌게 됨!
마치 이렇게 말도 안되는걸 주장하면 큰일이 난다는것을 보여주고 싶었다,,
👉 차후 재해석 캐스팅(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);
💙 사용하는 곳
'프로그래밍 언어 > C++' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] 동적할당과 캐스팅 : 버그 유형과 디버깅 연습/답안 (43, 44강) (2) | 2023.10.05 |
---|---|
[게임 프로그래머 입문 올인원] 동적할당과 캐스팅 : 전방 선언 (40강) (0) | 2023.09.15 |
[게임 프로그래머 입문 올인원] 동적할당과 캐스팅 : 동적할당 기초 (35강) (0) | 2023.09.14 |
C++ OPP 3대요소 : 다형성 (0) | 2023.09.14 |
C++ OPP 3대요소 : 상속성 (0) | 2023.09.14 |