ggjae / Algorithm-CS

🎅 1일 1알고리즘
0 stars 0 forks source link

[C++] 캐스트 연산자 (static_cast, dynamic_cast, const_cast, reinterpret_cast) #43

Open ggjae opened 3 years ago

ggjae commented 3 years ago

C의 타입 캐스팅 (묵시적, 암시적 형 변환)

ex)

int i = 3;
double d = 3.5;
i = double(d);

데이터의 손실이 일어날 수 있기 때문에 문제가 될 수 있다.

일반적으로 아래의 캐스트방법들은 함수<변환할타입>(변환대상)으로 진행된다.

static_cast

컴파일시에 논리적으로 변경 가능한 경우에 변경을 허용한다. static_cast<변환할타입>(변환대상)으로 강제 캐스팅이 아닌 캐스트 연산자를 이용하여 캐스팅이 가능하다. 업캐스트, 다운캐스트 다 가능

ex) static_cast(3);

static_cast는 논리상 맞지 않는 변환을 막아주는 역할을 합니다.

문제점 : 상속관계에서의 형변환이 안전하지 못하다. (자식을 부모가 대체가능함)

dynamic_cast

dynamic_cast와 static_cast는 아예 다르다. 런타임 중 안정성 검사를 진행하고 상속관계에서의 업캐스트나 변환을 진행시켜주지만, 다른 데이터형 변환은 허용하지 않는다. 가상함수를 이용하면 다운캐스팅도 진행이 가능하다.

const_cast

어떤 값을 const나 volatile로, 또는 그 반대로 변경하는것이 유일한 목적

const로 선언했지만 값을 바꾸어주는 경우 const_cast를 사용한다.

reinterpret_cast

저수준 프로그래밍에서 위험한 데이터형 변환을 안전하게 진행시키기 위하여 사용한다.

ggjae commented 3 years ago

그래서, 강제 캐스팅을 사용하는것보다 static_cast, dynamic_cast와 같은 캐스트 메소드를 사용했을 때의 이점이 뭔데?

  1. 컴파일러가 오류 체크

강제 캐스팅을 사용하면 런타임시에 segmentation fault, runtime error 등 예기치 못한 에러의 발생을 야기할 수 있는데 컴파일러딴에서 오류를 잡아버리면 추후 문제가 될 가능성을 줄여주는 이점

  1. 상속관계에 있어도 형변환 가능

다운캐스트에서는 안전하지 못한 것은 기억해야해. Liskov Substitution Principle도 기억하면 좋겠다. :)