C++ 캐스팅

하루공부·2024년 1월 14일
0

C++

목록 보기
4/25
post-thumbnail

C++ 아이콘 제작자: Darius Dan - Flaticon

캐스팅

  • C언어의 캐스팅은 몇가지 문제점이 있다,
    1. 적절하지 않은 방식으로 캐스팅을 해도 오류가 발생하지 않는다.
    2. 가독성이 떨어진다.
    3. 캐스팅의 의미를 파악하기가 힘들다.

하지만 C++에서는 상황에 맞는 잘 작동하는 캐스팅이 존재한다.


업 캐스팅

  • 부모 클래스의 포인터가 자식클래스를 가리킨다. ex) Parent *pp = &cp // cp는 자식 클래스 객체
    ==> ?? 객체가 다른데 대입할 수 있나? 가능하다
    ==> 간단히 자식 클래스는 부모 클래스의 정보를 모두 가지고 있기에 가능하다.
    ==> 자식 클래스는 부모 클래스로 부터 상속을 받으니 부모 클래스의 생성자를 불러와 올바르게 타입을 만들어 낼 수 있다.
  • 하지만 해당 포인터는 부모 클래스 정보밖에 없다. 그냥 자식이 가지고 있는 부모의 정보를 가리킨다.


다운 캐스팅

  • 간단하게 Children *pc = &pp은 오류가 난다. // pp는 부모 클래스 객체
  • 업 캐스팅과 반대로 부모 클래스는 자식의 정보를 가지지 않는데 없는 정보를 가리키는 포인터를 생성해서다.
  • 자식 클래스의 생성자를 어떻게 호출할껀데? 제대로된 포인터 생성이 이루어지지 않는다.

    물론 어떻게 자식클래스를 부모클래스에 넣고 그 클래스를 다시 자식에게 넣고 강제적으로 다운 캐스팅하면 되긴하는데 컴파일해도 프로그램이 멈출 수 있다
    그런데 이 오류를 컴파일러가 잡아내기 어려워서 하면 안되는 작업이다.


  • 4가지의 캐스팅 종류가 있다. 더있나?
  • 아래 4가지 모두 형태는 (원하는 캐스팅 종류)<바꾸려는 타입>(무엇을 바꿀 것인가?) 생겼다

static_cast

  • 평범하게 생각하던 그런 캐스팅 - c++에서 지원하는 일반적인 타입 변환
  • 포인터형을 변환할 때 다른 타입으로는 변경 불가능
    ex) int a = int형 데이터 ==> 가능
    ex) int
    a = double형 데이터 ==> 불가능
    • 하지만 상속 관계에 있는 포인터 끼리는 가능하다.


const_cast

  • 객체의 상수성(const)를 없애는 타입 변환
    ex) cosnt int 가 int로 변환됨

  • 함수 포인터에 대해서는 사용 불가능 ==> 컴파일 에러



dynamic_cast

  • 부모 클래스 포인터 에서 자식 클래스 포인터로 다운 캐스팅을 안전하게 수행
    ==> 올바르지 않게 사용시 에러가 뜬다. ==> 위의 다운 캐스팅에 따른 오류를 방지.
    • Children pc = dyanmic_cast<Children>(pp); ==> 컴파일 에러 발생
  • 캐스팅을 성공하면 target_type 형식의 값을 반환
  • 살패시 target_tpye이 포인터 형식이면 해당 형식의 null포인터 반환
  • 실패시 target_tpye에 대한 레퍼런스인 경우 예외 발생(bad_cast)
  • 대상 포인터가 무엇을 가리키냐에 따라 다르게 반응한다.
    • 자기 자식을 가리키는 부모 포인터

      해당 부모 클래스는 결국 자식 클래스를 가리키므로 다운 캐스팅 가능

    • 부모 클래스를 가리키는 부모 포인터

      자식 클래스만의 정보, 없는 정보를 가리키려고 하니 에러가 난다.



reinterpret_cast

  • 위험을 감수하고 하는 캐스팅으로 서로 관련이 없는 포인터들 사이의캐스팅
  • 다른 형태의 포인터로 바꾸기 때문에 예상치 못한 결과가 나올 수 있다.
  • 형변환이 이루어지면 해당 자료형의 bit수에 맞게 들어간다.
    ==> 작은 bit로 구성된 자료형에 들어가면 원래 크기를 다 표현하지 못함.
    ==> 큰 bit로 구성된 자료형에 들어가면 데이터가 그대로 유지


<참조>

참조
참조
참조
참조
참조
공부한 내용 복습

개인 공부 기록용 블로그입니다.
틀린 부분 있으다면 지적해주시면 감사하겠습니다!!

0개의 댓글