캐스팅이란?

-> 형 변환

 

캐스팅 사용 방법

-> 캐스팅<자료형>(데이터);

 

자료형

-> 어떤 자료형으로 형을 바꿀지 명시해준다.

 

데이터

-> 변환할 데이터

-> 어떤 데이터를 바꿀지 명시해준다.

 

#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

+ Recent posts