캐스트(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로 평가됩니다. dynamic_cast는 다형성(polymorphic) 타입에 대한 캐스트를 수행하며, 포인터가 실제로 가리키는 객체가 B 객체일 경우에만 A* 포인터를 B* 포인터로 변환할 수 있습니다.
3. reinterpret_cast<type>(expr)
reinterpret_cast는 포인터를 다른 어떤 타입의 포인터로든 변환할 수 있는 연산자입니다. 또한 포인터를 정수 타입으로 변환하거나, 그 반대로 정수 값을 포인터로 변환하는 것도 허용합니다.
4. static_cast<type>(expr)
static_cast는 비다형적(non-polymorphic) 캐스트를 수행하는 연산자입니다. 예를 들어, 기본(base) 클래스 포인터를 파생(derived) 클래스 포인터로 변환하는 데 활용할 수 있습니다.
위에서 소개한 모든 형변환 연산자는 실제로 클래스와 객체를 다룰 때 유용하게 사용됩니다. 우선은 다음 예제를 통해 C++에서 제공하는 기본적인 캐스트 연산자의 동작 방식을 이해해 보겠습니다. 아래 C++ 프로그램을 test.cpp 파일에 복사해 붙여넣은 후 컴파일하고 실행해 보세요.
예제 코드
#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으로 변환되는 것을 확인할 수 있습니다. 이처럼 기본 캐스트는 명시적으로 타입을 지정하여 값을 변환하는 가장 단순한 방법입니다.