Language/C++

[C++] 캐스트 연산자

마탁이 2020. 12. 15. 16:15

1. C의 캐스트 방법

  - 사용자의 요구대로 무조건 타입 변환 (부작용이 많다)
    e.g) (변환타입)변수;

 

2. C++의 캐스트 연산자

  1) static_cast
    - 상속 관계 클래스 포인터 및 레퍼런스, 기본 타입, 타입 체크X
    - 지정한 타입을 무조건 변경하는게 아닌 논리적으로 변환 가능한 타입만 변환한다.
       * 실수형<->정수형
         정수형<->실수형
         상호 호환되는 열거형 <-> 정수형
    - 포인트 타입을 다른 것으로 변환하는 것은 허용되지 않는다.
     > 상속 관계에 있는 포인터끼리만 변환이 허용된다.
    - 상속 관계에서 다운 캐스팅은 캐스트 연산자의 도움 없이는 허가되지 않는다.
     > 업 캐스팅 : 상속 계층의 위쪽으로 이동하는 변환.
     > 다운 캐스팅 : 상속 계층의 아래쪽으로 이동하는 변환, 부모가 자식의 모든 멤버를 가지지 않아 위험.
        e.g) static_cast<타입>(대상);

  2) dynamic_cast

    - 상속 관계 클래스 포인터 및 래퍼런스, 타입 체크, RTTI 기능 필요
    - 포인터 끼리 또는 래퍼런스 끼리 변환하는 캐스트 연산자
     > 포인터는 포인터로, 레퍼런스는 레퍼런스로 변환해야 한다.

     > 포인터끼리 변환 시도 상속 계층에 속한 클래스끼리만 변환할 수 있다.

 

     * static_cast는 다운 캐스팅을 할 때 무조건 변환을 허가하지만
       dynamic_cast는 실행 중에 타입을 점검하여 안전한 캐스팅만 한다.

    - dynamic_cast를 사용하기 위해 RTTI가 켜져있어야 하며, 하나 이상의 가상멤버함수를 가지고 있어야 한다.
    - 레퍼런ㅅ는 에러에 해당하는 NULL을 리턴할 수 없어 bad_cast 예외를 던지므로

       try-catch 블록에 작성해서 bad_cast 예외를 처리해야한다.
    - 부모 타입의 포인터를 자식 타입의 포인터로 다운 캐스팅 할 때, 안전하다고 판단될 때만 변환한다.
     > int * -> char * // error
     > Parent * -> int * // error
    - 변환 대상 포인터가 부모 클래스형 포인터 타입인데 자식 객체를 가지고 있을 때
     > 자식 클래스형 포인터로 변환 가능 (실제로 가리키고 있는 객체의 타입대로 캐스팅)
    - 부모 클래스형 포인터가 부모 객체를 가리키고 있을 때, 자식 클래스로의 다운 캐스팅은 안된다.
        e.g) dynamic_cast<타입*>(대상);

 

  3) const_cast

    - const, volatile, _ungligned 등의 속성 변경 (타입 X, 값 X)
    - 포인터의 상수성만 변경하고 싶을 때 사용하는 연산자
     > 상수 지시 포인터를 비상수 지시 포인터로 잠시 바꿀 수 있다.
     > 비상수 지시 포인터는 상수 지시 푄터로 항상 변환 가능하므로 캐스트 연산자가 필요 없다.
    - 포인터의 const 속성을 넣거나 빼거나 할 수 있다.
     > volatile 속성과 _ungligned 속성에 대해서도 변경할 수 있다.
       e.g) const_cast<타입*>(대상);
    - 정수를 실수 타입으로 변환하는 것은 상승 변화이지만, const_cast는 허용하지 않는다.
     > 자료형이나 값은 변경하지 못 한다.
     > const_cast는 오로지 포인터의 상수성만을 변경할 수 있다.

 

  4) reinterpret_cast (재해석 캐스트 연산자)
    - 포인터 끼리, 포인터와 수치형간의 변환
    - 임의의 포인터 타입끼리 변환을 허용하는 위험한 캐스트 연산자.
    - 포인터 타입간의 변환이나 포인터와 수치형 데이터의 변환에만 사용한다.
     > 강제 변환이므로 상속 관계에 있지 않은 포인터끼리도 변환 가능하다.
     > 좌변은 무조건 포인터 타입이어야 한다.
     > 기본 타입으로 cast를 할 수 없다.
     > 기본 타입들끼리의 변환에는 사용할 수 없다.
    - 정수형과 포인터간의 변환도 허용한다. (포인터 <- 정수)
    - 정수형 값을 포인터 타입으로 바꾸어 절대 번지를 가리키도록 할 때 이 연산자를 사용한다.
       e.g) reinterpret_cast<타입 *>(대상);

'Language > C++' 카테고리의 다른 글

[C++] 헤더 가드  (0) 2020.12.15
[C++] 포인터와 배열의 차이  (0) 2020.12.15
[C++] RTTI (RunTime Type Information)  (0) 2020.12.15
[C++] 상속의 3가지 관계와 가상 소멸자  (0) 2020.12.15
[C++] 컴파일 과정  (0) 2020.12.15