게임 개발/C++

[C++] 캐스팅 - 2. static_cast

유행성바코드 2025. 3. 5. 20:26

목차

  • 01. Intro
  • 02. static_cast
    • 사용 예시
    • C 스타일 캐스팅 vs static_cast
  • 03. 마무리
  • 04. 연관 내용

01. Intro

오늘은 C++ 스타일 캐스팅 중에서 static_cast에 대해 알아보겠습니다.

 


02. static_cast

static_cast는 C++ 스타일 캐스팅 중에서 가장 많이 사용하는 캐스팅입니다.

이는 C 스타일 캐스팅에서의 일부 위험한 변환을 제한합니다.

 

사용 예시

 

1. 값 타입 변환

#include <iostream>

using namespace std;

int main()
{

	int i = 50;
    // static_cast 사용
	double d = static_cast<double>(i);

	cout << i << endl;
	cout << d << endl;

	return 0;
}

기본적인 형태는 위 코드처럼 static_cast<변환할 타입>(변환할 값)의 형태로 사용합니다.

 

참고로, static_cast에서 사용하는 꺾쇠 괄호(<>)는 템플릿 문법이 아닙니다.

C++의 형 변환 문법에서 사용되는 특별한 문법 요소입니다.

따라서, static_cast의 꺾쇠 괄호(<>)는 [캐스트 타겟 타입] 또는 [타입 지정 구문]이라고 부릅니다.

 

2. 상속 관계에서 업 캐스팅

#include <iostream>

using namespace std;

// 부모 클래스
class Sport
{
public:
	Sport() : _num(0) {}

	int _num;
};

// 자식 클래스
class Soccer : public Sport
{
public:
	Soccer() : _player(22) {}

	int _player;
};

int main()
{

	// 업 캐스팅
	Soccer* soccer = new Soccer();
	Sport* sport = static_cast<Sport*>(soccer);

	// 변수값 출력
	cout << sport->_num << endl;

	return 0;
}

위 상황에서는 Soccer 클래스가 Sport 클래스를 상속 받습니다.

따라서, 모든 Soccer 클래스 객체는 Sport 클래스로 업 캐스팅을 진행해도 안전합니다.  

 

C 스타일 캐스팅 vs static_cast

1. const 제거 방지

#include <iostream>

using namespace std;

int main()
{

	const int i = 50;
	int* p = static_cast<int*>(&i);

	cout << i << endl;
	cout << *p << endl;

	return 0;
}

 

위 코드처럼 static_cast를 사용하면, 원본이 const인 경우에는 캐스팅을 할 수 없다고 경고합니다.

 

2. 위험한 포인터 타입 변환 방지

#include <iostream>

using namespace std;

int main()
{

	int i = 50;
	double* d1 = static_cast<double*>(&i);
	double* d2 = (double*)(&i);

	cout << i << endl;
	cout << d1 << endl;

	return 0;
}

위 코드처럼 포인터 타입 변환을 위험하게 하는 경우, 아래 사진처럼 경고문을 띄우고 빌드를 할 수 없습니다.

 

3. 잘못된 부모-자식 클래스 변환 방지?

#include <iostream>

using namespace std;

// 부모 클래스
class Sport
{
public:
	Sport() : _num(0) {}

	int _num;
};

// 자식 클래스 1
class Soccer : public Sport
{
public:
	Soccer() : _player(22) {}

	int _player;
};

// 자식 클래스 2
class Baseball : public Sport
{
	// 선언
};

int main()
{

	// 다운캐스팅
	Sport* sport = new Sport();
	Soccer* soccer = static_cast<Soccer*>(sport);

	// 변수값 출력
	cout << soccer->_num << endl;
	cout << soccer->_player << endl;

	return 0;
}

위 코드를 실행하니 static_cast도 C 스타일 캐스팅처럼 다운 캐스팅은 막아주지 않았습니다.

다운 캐스팅을 안전하게 하는 방법은 다른 C++ 스타일 캐스팅이 있으나, 추후 포스팅에서 다루겠습니다.

 

위 상황이 위험한 이유는 모든 Sport 클래스의 객체가 Soccer 클래스라고 보장할 수 없기 때문입니다.

만약에, static_cast를 사용해 다운 캐스팅을 하려면, 반드시 자식 클래스에 대한 정보를 부모 클래스에서 멤버 변수로 가지고 있어야 합니다. 그렇다면, 해당 멤버 변수를 통해서 자식 클래스의 타입을 알 수 있어 다운 캐스팅에 대한 위험을 어느 정도 방지할 수 있습니다. ( 물론, 이 방법도 개발자가 자식 클래스의 정보를 잘못 입력하면, 메모리 오염이 발생할 수 있습니다. )

 


03. 마무리

오늘은 static_cast에 대해서 알아보았습니다.

내일은 C++ 스타일 캐스팅의 두 번째 방법인 dynamic_cast에 대해서 알아보겠습니다.

 


04. 연관 내용

  • [C++] 캐스팅 - 1. C 스타일 캐스팅
 

[C++] 캐스팅 - 1. C 스타일 캐스팅

목차01. Intro02. 캐스팅C 스타일 캐스팅C++ 스타일 캐스팅03. C 스타일 캐스팅사용 예시C 스타일 캐스팅 지양 이유04. 마무리05. 연관 내용01. Intro오늘은 캐스팅(Casting)과 C스타일 캐스팅에 대해서 알아

epidemic-barcode.tistory.com

  • [C++] 캐스팅 - 3. dynamic_cast
 

[C++] 캐스팅 - 3. dynamic_cast

목차01. Intro02. dynamic_cast정의 및 특징예시성능03. 마무리04. 연관 내용01. Intro오늘은 C++ 스타일 캐스팅 중에서 dynamic_cast에 대해 알아보겠습니다. 02. dynamic_cast정의 및 특징dynamic_cast는 런타임 타임

epidemic-barcode.tistory.com

  • [C++] 캐스팅 - 4. const_cast
 

[C++] 캐스팅 - 4. const_cast

목차01. Intro02. const_cast정의 및 특징사용 예시주의점03. 마무리04. 연관 내용01. Intro오늘은 C++ 스타일 캐스팅 중에서 const_cast에 대해 알아보겠습니다.  02. const_cast 정의 및 특징const_cast는 const 속

epidemic-barcode.tistory.com

  • [C++] 캐스팅 - 5. reinterpret_cast
 

[C++] 캐스팅 - 5. reinterpret_cast

목차01. Intro02. reinterpret_cast정의 및 특징사용 예시03. 마무리04. 연관 내용01. Intro오늘은 C++ 스타일 캐스팅 중 마지막인 reinterpret_cast에 대해 알아보겠습니다. 02. reinterpret_cast정의 및 특징reinterpret_c

epidemic-barcode.tistory.com

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!