캐스팅이란?
-> 형 변환
캐스팅 사용 방법
-> 캐스팅<자료형>(데이터);
자료형
-> 어떤 자료형으로 형을 바꿀지 명시해준다.
데이터
-> 변환할 데이터
-> 어떤 데이터를 바꿀지 명시해준다.
#1. static_cast
-> 정적 캐스팅, 논리적인 캐스팅
-> 형 변환 시점이 컴파일 시점이기 때문에 static 이라는 명칭이 붙는다.
-> C스타일의 캐스팅과 비슷한 역할을 한다.
1
2
|
int iA = (int)3.14; // C 스타일 캐스팅
int iB = static_cast<int>(3.14); // C++ 스타일 캐스팅
|
cs |
객체 포인터의 형 변환
1
2
3
4
5
6
7
8
9
10
11
|
void main()
{
CObj* pObj = new CPlayer;
static_cast<CPlayer*>(pObj)->CPlayer_Func();
CPlayer* pPlayer = static_cast<CPlayer*>(pObj);
pPlayer->CPlayer_Func();
delete pObj;
}
|
cs |
static_cast의 주의사항
1. C스타일 캐스팅은 어떤 형이든 상관 없이 모두 변환이 가능하다.
하지만 이런 경우엔 위험성이 발생할 수 있다.
1
2
3
4
|
void main()
{
((CTest*)pObj)->CTest_Func();
}
|
cs |
2. 상속 관계 유무를 따지기 때문에 논리적인 캐스팅이라고 한다.
1
2
3
4
|
void main()
{
static_cast<CTest*>(pObj);
}
|
cs |
하지만 상속 관계만 따질 뿐 부모와 자식의 관계는 따지지 않기 때문에,
1
2
3
4
5
6
|
void main()
{
CPlayer* pPlayer = new CObj; // 불가능
CObj* pObj = new CObj; // 가능
CPlayer* pPlayer1 = pObj; // 불가능
}
|
cs |
잘못 사용하게 되면 또 다른 위험성이 생길 수가 있다.
예)
1
2
3
4
|
void main()
{
CPlayer* pPlayer2 = static_cast<CPlayer*>(pObj);
}
|
cs |
위와 같은 경우는 부모 클래스의 객체 타입이 자식 클래스로 바뀌게 되면서 문제가 발생한다.
#2. dynamic_cast
1. 안전한 캐스팅
-> 런타임 시점에 캐스팅을 진행하고,
-> 캐스팅에 성공할 경우 주소값을, 실패할 경우 nullptr를 반환하다.
dynamic cast의 주의점
1. 객체 포인터간의 형 변환만 가능하다.
2. virtual 키워드가 단 하나라도 존재하는 상속 관계에서만 가능하다.
조건문을 통한 dynamic cast 사용법
-> 다음과 같이 dynamic_cast를 통해서 CPlayer 또는 CMonster로 형 변환에 성공하였는지 확인한 후,
-> 성공을 하였으면, 해당 객체 안에 있는 함수를 호출할 수 있다.
#3. const_cast
-> const의 성향을 제거해주는 캐스팅
-> 단, 원본의 const는 제거할 수 없다.
1
2
3
4
5
6
7
8
9
10
11
12
|
int iA = 10;
const int* ptr = &iA;
*ptr = 999; // 불가능
*(const_cast<int*>(ptr)) = 999; // 가능
cout << iA << endl;
const int iA = 10;
iA = 999; // 불가능
const_cast<int>(iA) = 999; // 불가능
|
cs |
#4. reinterpret_cast
-> 모든 포인터간의 형 변환을 허용한다
-> 잘 사용하지 않는 캐스팅
'Programming > C++ Basic' 카테고리의 다른 글
C++ 인라인 (0) | 2020.09.23 |
---|---|
C++ 바인딩 (0) | 2020.09.21 |
C++ 가상 함수(virtual), 가상 소멸자, 순수 가상 함수 (0) | 2020.09.18 |
C++ 오버라이딩 (0) | 2020.09.18 |
C++ 객체 포인터 (0) | 2020.09.17 |