콘텐츠로 이동

캐스팅 (Casting)

static_cast(double_value) 와 같은 C++ 스타일 캐스트를 사용하거나 int64_t y = int64_t{1} << 42 와 같은 산술 유형 변환을 위해 중괄호 초기화를 사용하세요. 캐스트가 void 가 아닌 이상 (int)x와 같은 캐스트 형식을 사용하지 마세요. T가 클래스 유형인 경우에만 T(x)와 같은 캐스트 형식을 사용할 수 있습니다.

C++에서는 캐스트 작업 유형을 구별하는 C와 다른 캐스트 시스템을 도입했습니다.

C 캐스트의 문제점은 작업이 모호하다는 것입니다. 때로는 변환(예: (int)3.5 )을 수행하고 때로는 캐스트(예: (int)"hello" )를 수행합니다. 중괄호 초기화 및 C++ 캐스트는 종종 이러한 모호성을 피하는 데 도움이 될 수 있습니다. 또한 C++ 캐스트는 검색 시 더 잘 보입니다.

C++ 스타일의 캐스트 구문은 장황하고 번거롭습니다.

일반적으로 C 스타일 캐스트를 사용하지 마세요. 대신 명시적인 유형 변환이 필요한 경우 이러한 C++ 스타일 캐스트를 사용하세요. 일부는 표준 C++ 언어의 일부이고 일부는 absl/base/casts.h 에 정의되어 있습니다. 올바르게 적용되는 첫 번째 항목을 사용하세요.

  • 중괄호 초기화를 사용하여 산술 유형을 변환합니다(예: int64_t{x} ). 변환으로 인해 정보가 손실될 수 있는 경우 코드가 컴파일되지 않으므로 이는 가장 안전한 접근 방식입니다. 구문도 간결합니다.
  • 명시적으로 클래스 유형으로 변환하는 경우 함수 스타일 캐스트를 사용하세요. 예를 들어 static_cast(some_cord) 보다 std::string(some_cord) 를 선호합니다.
  • 유형 계층 구조를 안전하게 캐스팅하려면 absl::implicit_cast를 사용하세요(예: Foo를 SuperclassOfFoo로 캐스팅하거나 Foo를 const Foo로 캐스팅). C++에서는 일반적으로 이 작업을 자동으로 수행하지만 ?: 연산자 사용과 같은 일부 상황에서는 명시적인 업캐스트가 필요합니다.
  • 클래스에서 해당 슈퍼클래스로 포인터를 명시적으로 업캐스트해야 하거나 슈퍼클래스에서 서브클래스로 포인터를 명시적으로 캐스팅해야 하는 경우 값 변환을 수행하는 C 스타일 캐스팅과 동일하게 static_cast를 사용합니다. 이 마지막 경우에는 개체가 실제로 하위 클래스의 인스턴스인지 확인해야 합니다.
  • 슈퍼클래스에서 하위클래스로 포인터를 캐스팅하려면 absl::down_cast를 사용하세요. 개체가 실제로 하위 클래스의 인스턴스인지 확인해야 합니다.
  • const_cast를 사용하여 const 한정자를 제거합니다(const 참조).
  • reinterpret_cast를 사용하여 포인터 유형과 정수 및 void*를 포함한 다른 포인터 유형 간의 안전하지 않은 변환을 수행합니다. 현재 수행 중인 작업을 알고 있고 앨리어싱 문제를 이해하는 경우에만 이 방법을 사용하십시오. 또한 (형변환 없이) 포인터를 역참조하고 std::bit_cast를 사용하여 결과 값을 형변환하는 것을 고려하십시오.
  • std::bit_cast를 사용하면 double의 비트를 int64_t로 해석하는 것과 같이 동일한 크기의 다른 유형(말장난 유형)을 사용하여 값의 원시 비트를 해석할 수 있습니다.

Dynamic_cast 사용에 대한 지침은 RTTI 섹션을 참조하세요.


이해하기 쉽게 설명하기

핵심: C 스타일 캐스트 대신 C++ 캐스트·중괄호 초기화

(int)x 같은 C 스타일 캐스트는 쓰지 마세요(void 캐스트 제외). 동작이 모호하고(변환인지 재해석인지 불분명) 검색으로 찾기도 어렵습니다. 대신 의도가 드러나는 C++ 캐스트를 쓰세요.

static_cast<float>(double_value);  // C++ 스타일 캐스트
int64_t y = int64_t{1} << 42;      // 산술 변환은 중괄호 초기화

상황별 선택 (맞는 첫 번째를 사용)

목적 사용
산술 타입 변환 중괄호 초기화 int64_t{x} (정보 손실 시 컴파일 오류 → 가장 안전)
클래스 타입으로 변환 함수 스타일 std::string(some_cord)
계층 안전 업캐스트 absl::implicit_cast
다운캐스트(타입 보장됨) absl::down_cast
const 제거 const_cast
안전하지 않은 포인터 재해석 reinterpret_cast (앨리어싱을 이해할 때만)
같은 크기 타입의 비트 재해석 std::bit_cast

dynamic_cast 사용 지침은 RTTI 섹션을 참조하세요.