C++ 타입 변환 이해하기: 암시적, 명시적, 캐스팅 기법
C++ 타입 변환
C++이 데이터 타입 변경을 어떻게 처리하는지, 자동 변환부터 안전한 캐스팅 기법까지 실전 코드 예제로 알아봅니다.
C++에서는 한 타입의 값을 다른 타입으로 변환할 수 있습니다. 이 과정을 타입 변환(Type Conversion)이라 합니다. 변환 규칙을 이해하면 더 명확하고 안전한 코드를 작성할 수 있습니다.
주요 두 가지 범주:
- 암시적(자동) 변환
- 명시적 변환(타입 캐스팅)
암시적 타입 변환
컴파일러가 호환되는 타입으로 값을 자동 승격/강등시키는 변환입니다. 소스 코드에 캐스팅이 보이지 않으며 내부적으로 일어납니다.
예제 1: int → double
#include <iostream>
using namespace std;
int main() {
int num_int = 9;
double num_double = num_int; // 암시적 변환
cout << "num_int = " << num_int << endl;
cout << "num_double = " << num_double << endl;
return 0;
}
실행 결과
num_int = 9
num_double = 9
컴파일러가 대입 전 int를 double로 자동 확대했습니다.
예제 2: double → int (잘림 발생)
#include <iostream>
using namespace std;
int main() {
double num_double = 9.99;
int num_int = num_double; // 암시적 변환
cout << "num_int = " << num_int << endl;
cout << "num_double = " << num_double << endl;
return 0;
}
실행 결과
num_int = 9
num_double = 9.99
int는 소수부가 없으므로 소수 부분이 버려집니다. 이는 축소 변환(Narrowing Conversion)의 예입니다.
팁: 더 넓은 타입에서 좁은 타입으로 변환 시 정밀도 손실이 발생할 수 있습니다. 손실이 중요하면 명시적으로 처리하세요.
축소 변환과 데이터 손실
더 큰 타입을 더 작은 타입에 대입하면 컴파일러가 데이터를 잘라낼 수 있습니다. 범위 불일치를 시각화하면 예기치 않은 버그를 예방할 수 있습니다.
명시적 변환(타입 캐스팅)
변환을 직접 제어해야 할 때 명시적 캐스팅을 사용합니다. C++은 같은 목적을 위한 여러 문법을 제공하며 각각 스타일 가이드가 다릅니다.
- C 스타일 캐스팅
- 함수 스타일 캐스팅(구형 C++ 스타일)
- 현대 C++ 캐스트:
static_cast, dynamic_cast, const_cast, reinterpret_cast
C 스타일 타입 캐스팅
C에서 물려받은 전통적 형태:
(data_type)expression;
예제:
#include <iostream>
using namespace std;
int main() {
int num_int = 26;
double num_double = (double)num_int; // C 스타일 캐스팅
cout << "num_double = " << num_double << endl;
return 0;
}
함수 스타일 캐스팅
생성자 호출처럼 읽히는 더 명시적인 대안:
data_type(expression);
예제:
#include <iostream>
using namespace std;
int main() {
int num_int = 26;
double num_double = double(num_int); // 함수 스타일 캐스팅
cout << "num_double = " << num_double << endl;
return 0;
}
C 스타일과 함수 스타일 캐스팅 비교
#include <iostream>
using namespace std;
int main() {
double num_double = 3.56;
cout << "num_double = " << num_double << endl;
int num_int1 = (int)num_double; // C 스타일
int num_int2 = int(num_double); // 함수 스타일
cout << "num_int1 = " << num_int1 << endl;
cout << "num_int2 = " << num_int2 << endl;
return 0;
}
실행 결과
num_double = 3.56
num_int1 = 3
num_int2 = 3
두 캐스팅 결과는 동일하지만, 함수 스타일이 현대 C++에서 더 선명하고 실수하기 어려워 권장됩니다.
현대 C++ 캐스트 연산자
클래식 형태 외에 타입 안전성과 의도를 더 명확히 하는 4가지 전용 캐스트 연산자가 있습니다:
static_cast - 컴파일 타임 변환, 상속 관계 존중
dynamic_cast - 다형성 계층에서 안전한 다운캐스팅
const_cast - const 속성 제거/추가
reinterpret_cast - 비트 패턴의 저수준 재해석
각 연산자는 별도 튜토리얼에서 심층 다룹니다.
추천 튜토리얼:
- C++ string ↔ int 변환
- C++ string ↔ float, double 변환