c++에서의 형변환

보물창고·2021년 8월 16일
0

참고자료

https://3dmpengines.tistory.com/1421
https://gamedevforever.com/19
윤성우, c++ 기초 플러스 , fundamental c++
https://prostars.net/55?category=2732

https://ence2.github.io/2020/11/c-%EC%BA%90%EC%8A%A4%ED%8C%85-%EC%B4%9D%EC%A0%95%EB%A6%AC%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8F%AC%EC%9D%B8%ED%84%B0-%EC%BA%90%EC%8A%A4%ED%8C%85-%ED%8F%AC%ED%95%A8/

c언어의 형변환보다는 c++의 형변환을 사용해야 하는 이유

:

상향형변환의 한계

  • 부모클래스를 참조로 하고, 파생클래스가 실형식 일때,

-> 해당 객체로 파생클래스의 멤버에 접근할 수 없다.

c언어의 캐스팅으로 접근이 가능하다.

: 하향형변환이다.

-> 파생클래스로 기초 클래스를 가리키는 것은 불필요한 형변환이다.

  • but, 실형식이 파생클래스가 아닌 부모클래스를 하향형변환하면
    논리적으로 보더라도, 문제가 발생해야 하지만,,,
    컴파일 오류 발생하지 않는다.
    이는 c언어 캐스팅은 무적의 형변환 연산이기 때문이다.

    c언어 방식의 캐스팅 사용을 하지말자.

c++에서의 4가지의 캐스팅

  • 형변환의 피연산자는 반드시 괄호로 묶어야 한다.

1. dynamic_cast

: 런타입 시에 상향, 하향 형변환을 합니다.

  • 기본적으로는 하향 형변환에서는 막고 있다.

  • 상향형변환은 가능하지만 어째서인지 접근은 못하고 있다...
    -> 이유 공부좀...

  • 부모클래스에서 virtual 선언으로 다형성을 만들어 줌으로써
    하향 형변환이 가능하다.

    -> 하지만 이는 문제를 유발한다. 왜냐하면 pCar1은 작은범위의 값을 가리키고 있다가 확장된 파생클래스를 가리키는 것은 맞지 않기 때문.

  • 하지만 부모가 참조, 파생이 실형식인 상태에서는
    형변환이 가능하다.

언제 사용해야 할까?

: 상속 관계에 있는 객체를 상향형변환이나 하향형변환해서 사용해야 할때

대체할 수 있는 방법은 없을까?

https://velog.io/@kwt0124/5%EC%9E%A5.-%EA%B5%AC%ED%98%84
27 장 참고

특징

  • 다운캐스팅 할때 nullptr과 bad_cast가 발생한다.

  • RTTI 특성을 가진다.

  • 하나 이상의 가상함수가 필요하다.

  • 상속 관계에서 안정적인 캐스팅을 가능케한다.

  • 상속관계에서만 사용이 가능하다.

  • 런타임 도중에 형변환이 이루어지므로 속도가 느리다.

  • 형변환이 실패하면 대상이 포인터면 nullptr, 참조자이면 bad_cast 예외를 던짐으로써 안전한 형변환이라고 할 수 있다.

  • 기본적으로는 상향형변환만 가능하지만, 부모클래스에 virtual , 파생클래스에서 오버로딩이 되어 있다면 하향형변환도 가능하다.

  • 런타임 중에 형변환을 하므로, dynamic이라고 부르는 것이다.

  • 올바른 형변환인지 검사를 하기 때문에 형변환하는데 static_cast보다도 시간이 걸린다.

dynamic_cast를 하지 않고, 파생클래스에 접근하는 방법은 없을까?

: 이펙티브 194 쪽에 있음.
-> 이펙티브 시리즈로 넘어 가자

2. static_cast

: 컴파일 타임에 상향 , 하향 변환을 진행한다.

abstract data type

: 부모 클래스를 이용해 자식 클래스를 참조할 경우


-> 가상함수로 선언되어 있지 않기 때문에 참조형식의 함수가 호출되는 것이다.

예시


: 부모 클래스의 멤버로 할당 후, 형변환하면 변환이 이루어져야 하지 않지만,
형변환을 진행하면서 결과적으로 파생클래스의 멤버 함수를 호출시켰다.

-> static_cast 형변환은 안전하지 못하다는 것을 확인할 수 있다.

dynamic_cast vs static_cast

  • dynamic_cast로 형변환을 위해 virtual 추가함.

    -> nullptr을 반환함으로써 형변환 실패했다는 것을 나타낸다.
profile
🔥🔥🔥

0개의 댓글