C Style, C++ Style 캐스팅
C++에서 사용 가능한 캐스팅 스타일은 C, C++ 2가지가 존재한다.
C Style은 강제적인 형변환이다. 아래의 단점들로 인해 일반적으로 지양해야할 방식으로 여겨진다.
- 안전하지 않다. 별도의 타입 체크를 하지 않기 때문에 의도하지 않은 방식으로 동작할 수 있다.
- 가독성 및 유지보수성이 나쁘다. 어떠한 타입의 데이터를 형변환하는 것인지 명확하지 않을때가 많다.
- 디버깅이 힘들다. 강제적인 형변환이기 때문에 타입 불일치에 대한 어떠한 정보도 제공하지 않는다.
C Style 형변환은 괄호 안에 target 타입을 적는 방식으로 한다.
// C Style
cout << (char)65 << endl;
cout << (int)'A' << endl;
// 아래의 형변환 방식도 C style과 동일한 것으로 간주됨
cout << double(15) << endl;
double(15)와 같은 함수 스타일의 형변환도 c style 형변환으로 취급하는 것으로 표준에 나와있다. (https://en.cppreference.com/w/cpp/language/explicit_cast)
The functional-style cast expression
....
If there is exactly one expression in parentheses, this cast expression is exactly equivalent to the corresponding C-style cast expression.
형 변환을 하는 타입의 정밀도에 따라 2가지로 나눌 수 있다.
- numeric promotion : 낮은 정밀도의 값을 더 높은 정밀도로 형 변환
- numeric conversion : 타입이 바뀌거나 높은 정밀도의 값을 낮은 정밀도로 형변환
// numeric promotion 예시
float a = 12.0f;
double b = a;
// numeric conversion 예시 1
double d = 3.5;
short s = d;
// numeric conversion 예시 2
int i = 12345;
char c = i;
암시적 형변환(implicit casting)
사용자가 지정해주지 않아도 컴파일러가 자동으로 수행하는 형변환을 암시적 형변환이라고 한다. 대표적으로 정수형 변수에 실수형 리터럴을 대입하는 경우가 있다.
int main()
{
using namespace std;
int a = 123.0; // 이 부분에서 암시적 형변환이 일어남
cout << typeid(a).name() << endl;
}
이러한 경우에는 정밀도가 높은 타입에서 낮은 타입으로 형변환이 이루어지기 때문에 컴파일러가 경고 메시지를 출력한다.

static_cast
C++ 스타일의 대표적인 형변환 방식은 static_cast를 사용하는 것이다. 형변환시 컴파일 타임에 타입을 체크하기 때문에 보다 안전하다. 형변환된 값을 결과로 반환한다.
cout << static_cast<char>(65) << endl;
cout << static_cast<int>('A') << endl;

잘못된 캐스팅을 수행할 경우 IDE에서 오류 메시지를 출력한다.
char ch(97);
cout << static_cast<int*>(ch) << endl;

typeid 키워드
typeid키워드를 사용할 경우 손쉽게 변수/리터럴의 타입을 알 수 있다.
int main()
{
using namespace std;
int long a = 123L;
cout << typeid(4.0).name() << endl;
cout << typeid(4).name() << endl;
cout << typeid("Hell World").name() << endl;
cout << typeid('A').name() << endl;
cout << typeid(a).name() << endl;
}

'C++ 학습' 카테고리의 다른 글
| [C++] 연산자 (0) | 2023.10.01 |
|---|---|
| [C++] 심볼릭 상수 (0) | 2023.09.28 |
| [C++] 네임스페이스 (0) | 2023.09.26 |
| [C++] 헤더 (0) | 2023.09.25 |
| [C++] 함수 (0) | 2023.09.25 |