캐스팅
C++에서의 캐스팅(형 변환)은 하나의 자료형을 다른 자료형으로 변환하는 것이다. 다음과 같은 상황에서 사용한다.
int main(){
int a = 1;
double b = 3.14;
int c = b;
int d = (int)b;
}
이는 double 자료형을 int 자료형으로 캐스팅하는 예시이다. 암시적 캐스트는 컴파일러가 자동적으로 형 변환을 해주고, 명시적 캐스트는 프로그래머가 직접 형 변환하는 것이다.
static_cast (정적 캐스트)
- 일반적인 캐스팅 방식
- 컴파일 시점에서 형 변환이 가능한지 검사한다.
- 기본 자료형 사이의 형 변환을 허용한다.(int → float등이 가능하다는 의미).
- 포인터 타입의 형 변환은 허용하지 않지만, 상속 관계에 있는 클래스 타입의 형 변환은 허용한다.
- 다운캐스팅과 같은 오류 체크를 하지 않기 때문에 주의해서 사용해야 한다.
- 업캐스팅 - 자식 클래스를 부모 클래스로 변환하는 것. 자식 클래스는 부모 클래스의 맴버 변수와 매서드들을 포함라기 때문에 항상 안전하다. 컴파일러가 변환을 암묵적으로 처리하기 때문에, 명시적으로 적어줄 필요도 없다.
- 다운캐스팅 - 부모 클래스를 자식 클래스로 변환하는 것. 업캐스팅과는 달리, 부모 클래스에는 자식 클래스에 추가된 맴버 변수나 함수에 대한 정보가 없기 때문에, 안전하지 않고, 에러를 발생시킬 가능성이 있다. 따라서 다운캐스팅 시에는 dynamic_cast를 사용한다.
const_cast (상수 캐스트)
- const속성을 부여하거나 제거할 때 사용하는 연산자이다.
- 외부의 다른 라이브러리를 사용할 때, 인자값으로 비상수성 객체를 요구하는 것과 같은 특수한 상황에서 한시적으로 사용한다.
reinterpret_cast (재해석 캐스트)
- 어떠한 타입이든 다른 어떠한 타입으로 변환이 가능한 연산자.
- static_cast보다 강력하지만, 안전성은 떨어진다.
- 변환 관계에 놓인 두 객체의 관계가 명확하거나, 특정 목적을 달성할 때만 사용하는 것이 바람직하다.
dynamic_cast (동적 캐스트)
- 런 타임시에 형 변환이 가능한지 검사하여, 형 변환을 보다 안전하게 처리하는 연산자
- 런타임에 상속 계층 관계를 가로지르거나, 주로 다운캐스팅 시에 사용
- 다형성을 띄지 않은 객체간 변환은 불가능하며, 시도시 컴파일 에러가 발생한다.
- 변환 비용이 비싸기 때문에 자주 사용하지 않는다.
- 특정 객체의 타입을 질의해 보아야할 상황에 주로 사용한다.