목차
- 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
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 캐스팅 - 4. const_cast (0) | 2025.03.07 |
|---|---|
| [C++] 캐스팅 - 3. dynamic_cast (0) | 2025.03.06 |
| [C++] 캐스팅 - 1. C 스타일 캐스팅 (0) | 2025.03.04 |
| [C++] 스택 프레임 - 2. 적재 순서 메모리 확인 (0) | 2025.03.03 |
| [C++] 스택 프레임 - 1. 정의 및 구조 (0) | 2025.03.02 |