-
[C++] 캐스트 연산자 (static_cast, dynamic_cast, ...)ABOUT COMPUTER/학습 STUDY 2021. 10. 12. 19:47
C의 타입 캐스팅에서는 묵시적 형 변환, 암시적 형 변환들이 존재했다.
C++에서는 이보다 더 강력한 형 변환을 지원해주는데 최근 면접 질문에서 들어 본 캐스트 연산자에 대해서 깊이 있게 공부해보자는 생각을 하게 되었다.
ex)
int i = 3;
double d = 3.5;
cout << int(d);
라고 했을 때, d에 대한 데이터 손실이 일어날 수 있기 때문에 문제가 될 수 있는데
아래 캐스트 연산자들을 알아보고 데이터 손실을 없애며 안전하게 캐스팅하는 방법에 대해 알아보자.
일반적으로 아래 캐스트 메소드들은 함수<변환할타입>(변환대상)으로 진행된다.
ex) static_cast<int>(d);
static_cast
컴파일시 논리적으로 변경이 가능한 경우에 변경을 허용하는 메소드
강제 캐스팅이 아닌 캐스트 연산자를 이용하여 캐스팅이 가능하다. 업캐스트와 다운캐스트가 전부 다 가능한데, 강제캐스팅과 다른점은 논리상 맞지 않는 변환을 막아주는 역할을 한다.
하지만 static_cast의 경우 상속관계에서 형변환이 안전하지 못하고 자식을 부모가 대체해버려도 오류를 뽑아내지 않는다는 단점을 가지고 있다.
dynamic_cast
위의 static_cast와는 다른 dynamic_cast이다. 런타임중에 안정성 검사를 진행하고 상속관계에서의 업캐스트나 변환을 지원해주지만 다른 데이터형 변환은 허용하지 않는다. 업캐스팅만이 가능하고 만약 가상함수까지 사용한다면 다운캐스팅 또한 지원해준다.
const_cast
어떤 값을 const나 volatile로, 또는 그 반대로 변경하는것의 목적을 둔 캐스팅 연산자이다.
reinterpret_cast
저수준 프로그래밍에서 위험한 데이터형 변환을 안전하게 진행시키기 위해서 사용한다.
그래서 강제 캐스팅을 사용하는것보다 static_cast, dynamic_cast와 같은 캐스트 연산자를 사용했을 때의 이점이 뭘까?
컴파일러가 오류 체크를 진행하는 것
-> 강제 캐스팅을 사용하면 런타임시 seg fault, runtime error 등 예기치 못한 에러를 발생시킬 수 있는데 컴파일러딴에서 오류를 잡아 추후 문제가 될 가능성을 줄여주는 이점을 가지고 있다.
상속관계에 있어도 형변환이 가능하다.
-> 하지만 다운캐스트에서는 안전하지 못한 것을 기억하고 LSP를 기억했으면 좋겠다.
'ABOUT COMPUTER > 학습 STUDY' 카테고리의 다른 글
[C++] 스마트 포인터 (부제 : 가비지 컬렉터와 스마트 포인터의 차이점) (0) 2021.10.12 [Deep Learning] 자전거 수요 예측하기 - kaggle (0) 2021.04.08 [이것이 취업을 위한 코딩 테스트다 with 파이썬] PART 03 (2) 2021.01.26 What is RPA? (RPA란?) 초심자를 위한 RPA tool에 대한 장단점 비교 (10) 2020.07.10