기존의 C언어에서는 2가지 캐스팅 방법이 있습니다. 하나는 그냥 컴파일러에서 알아서 캐스팅하는 암시적(implicit) 캐스팅, 다른 하나는 프로그래머가 직접 캐스팅하라고 지정하는 명시적(explicit) 캐스팅이 있습니다.
암시적 캐스팅의 경우 int와 double의 덧셈을 수행할 때, int형 변수가 자동으로 double 변수로 캐스팅 되는 것과 같은 것을 말하고, 명시적 캐스팅의 경우 void* 타입의 주소를 특정 구조체 포인터 타입의 주소로 바꾸는 것과 같은 것입니다.
// 명시적 캐스팅
ptr = (Something *)other_ptr;
int_variable = (int)float_variable;
이렇게 사용을 하는데, 몇가지 문제점이 있습니다.
먼저 위와 같은 타입 캐스팅의 경우 말도 안되는 캐스팅에 대해서 컴파일러가 오류를 발생시키지 않습니다. 따라서 프로그래머의 실수에 취약합니다. 또한 괄호가 많아져서 가독성이 떨어지게 됩니다. 괄호가 많아지면 읽는 사람이나 코드를 유지 보수하는 사람 입장에서 불편합니다. 위와 같은 C 형식 형변환에서는 읽는이가 그 형변환의 의미를 명확하게 알 수 없습니다.
하지만 C++에서는 다음과 같은 4가지 캐스팅을 제공하고 있습니다.
- static_cast : 우리가 흔히 생각하는, 언어적 차원에서 지원하는 일반적인 타입 변환
- const_cast : 객체의 상수성(const)를 없애는 타입 변환. 쉽게 말해 const int가 int로 바뀐다.
- dynamic_cast : 파생 클래스 사이에서의 다운 캐스팅
- reinterpret_cast : 위험을 감수하고 하는 캐스팅으로, 서로 관련이 없는 포인터들 사이의 캐스팅
원하는 캐스팅 종류<바꾸려는 타입>(무엇을 바꿀 것인가) 이렇게 사용합니다.
예를 들어, static_cast로 float 타입의 float_variable 이라는 변수를 int 타입의 변수로 타입 변환하기 위해서는 아래처럼 해주면 됩니다.
static_cast<int>(float_variable); // C++
(int)(float_variable) // C
'C++' 카테고리의 다른 글
업 캐스팅과 다운 캐스팅 (0) | 2020.10.29 |
---|---|
상속 (Inheritance) (0) | 2020.10.27 |
연산자 오버로딩(전위/후위 증감 연산자) (0) | 2020.10.27 |
malloc과 new의 차이 (0) | 2020.10.24 |
스택, 힙, 코드, 데이터 영역 (0) | 2020.10.23 |