캐스팅 Casting

최정훈·2024년 11월 15일

캐스팅

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 (동적 캐스트)

  • 런 타임시에 형 변환이 가능한지 검사하여, 형 변환을 보다 안전하게 처리하는 연산자
  • 런타임에 상속 계층 관계를 가로지르거나, 주로 다운캐스팅 시에 사용
  • 다형성을 띄지 않은 객체간 변환은 불가능하며, 시도시 컴파일 에러가 발생한다.
  • 변환 비용이 비싸기 때문에 자주 사용하지 않는다.
  • 특정 객체의 타입을 질의해 보아야할 상황에 주로 사용한다.
profile
게임개발자(희망)의 공부일지

0개의 댓글