Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 형변환(캐스트) 연산자 완벽 가이드

캐스트(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으로 변환되는 것을 확인할 수 있습니다. 이처럼 기본 캐스트는 명시적으로 타입을 지정하여 값을 변환하는 가장 단순한 방법입니다.