캐스트(cast)는 하나의 데이터 타입을 다른 데이터 타입으로 강제로 변환하는 특수 연산자입니다. 연산자로서 캐스트는 단항(unary) 연산자에 해당하며, 다른 단항 연산자들과 동일한 우선순위를 가집니다.
C++ 컴파일러 대부분이 지원하는 가장 일반적인 캐스트 형식은 다음과 같습니다.
(type) expression
여기서 type은 변환하고자 하는 목표 데이터 타입을 의미합니다. 이 외에도 C++은 아래와 같은 네 가지 전용 캐스팅 연산자를 제공합니다.
C++의 네 가지 캐스팅 연산자
1. const_cast<type>(expr)
const_cast는 캐스트 과정에서 객체의 const 또는 volatile 속성을 명시적으로 덮어쓰기 위해 사용됩니다. 대상 타입은 const/volatile 속성만 다를 뿐 소스 타입과 동일해야 합니다. 즉, 전달된 객체의 const 속성을 설정하거나 제거하는 용도로 활용됩니다.
2. dynamic_cast<type>(expr)
dynamic_cast는 런타임에 캐스트의 유효성을 검증하는 안전한 형 변환을 수행합니다. 캐스트가 불가능한 경우 변환에 실패하며 표현식은 null로 평가됩니다. 이 연산자는 다형적(polymorphic) 타입에 대해 동작하며, 포인터되는 실제 객체가 B 타입일 때만 A* 포인터를 B* 포인터로 변환할 수 있습니다.
3. reinterpret_cast<type>(expr)
reinterpret_cast는 포인터를 완전히 다른 타입의 포인터로 변경합니다. 포인터를 정수 타입으로 변환하거나, 그 반대로 변환하는 것도 허용합니다.
4. static_cast<type>(expr)
static_cast는 비다형적(non-polymorphic) 캐스트를 수행합니다. 예를 들어 기본 클래스(base class) 포인터를 파생 클래스(derived class) 포인터로 변환할 때 사용할 수 있습니다.
예제 코드
캐스트는 상황에 따라 매우 구체적으로 적용됩니다. 컴파일러가 수행하는 기본적인 캐스트 예제를 살펴보겠습니다.
#include <iostream>
using namespace std;
main() {
double a = 21.09399;
float b = 10.20;
int c ;
c = (int) a;
cout << "Line 1 - Value of (int)a is :" << c << endl ;
c = (int) b;
cout << "Line 2 - Value of (int)b is :" << c << endl ;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
Line 1 - Value of (int)a is :21 Line 2 - Value of (int)b is :10
double 타입의 21.09399는 int로 변환되며 소수점 이하가 버려져 21이 되고, float 타입의 10.20 역시 10으로 변환되는 것을 확인할 수 있습니다. 이처럼 명시적 캐스트는 데이터 손실이 발생할 수 있으므로, C++에서는 상황에 맞는 적절한 캐스팅 연산자를 선택하는 것이 중요합니다.