58 자료형 변환하기
C 언어에서는 자료형이 같거나 크기가 큰 쪽, 표현 범위가 넓은 쪽으로 저장하면 자동으로 변환이 됩니다.
int num1 = 10; unsigned int num2 = num1; // int와 unsigned int는 자료형이 같음 long long num3 = num1; // long long이 int보다 크기가 큼
하지만 자료형이 다르면서 크기가 작은 쪽, 표현 범위가 좁은 쪽으로 저장하면 컴파일 경고가 발생합니다. 예를 들어 실수에서 소수점 이하 자리를 버리는 기능을 구현하고자 실수를 정수로 저장했을 때 프로그래머가 의도한 상황이지만 컴파일 경고가 발생합니다.
float num1 = 3.56f; int num2 = num1; // 실수형 값을 정수형 변수에 저장하여 컴파일 경고 발생
컴파일 결과
warning C4244: '초기화 중': 'float'에서 'int'(으)로 변환하면서 데이터가 손실될 수 있습니다.
다음 그림과 같이 자료형의 크기가 큰 쪽, 표현 범위가 넓은 쪽으로 자동 변환되는 것을 형 확장이라 하고, 이런 변환을 암시적 형 변환이라고 합니다. 반대로 자료형 크기가 작은 쪽, 표현 범위가 좁은 쪽으로 변환되는 것이 형 축소입니다. 이때 형 축소에서 컴파일 경고가 나오지 않도록 만드는 것을 형 변환(type conversion, type casting, 타입 캐스팅)이라 합니다. 특히 프로그래머가 강제로 자료형을 변환한다고 해서 명시적 형 변환(explicit type conversion)이라 부르기도 합니다.
형 확장은 값의 손실이 없으므로 컴파일러가 알아서 처리할 수 있습니다. 하지만 형 축소는 값의 손실이 발생하여 컴파일러가 알아서 처리할 수 없으므로 경고가 발생합니다. 따라서 형 변환으로 의도를 밝혀야만 컴파일러가 안심하고 변환을 하게 됩니다. 즉, 형 변환은 컴파일러에게 자료형을 변환한다는 의도를 명확하게 알려주는 것입니다.
특히, 형 변환은 구조체와 포인터를 조합하여 사용할 때 유용하게 활용됩니다.
58.1 기본 자료형 변환하기
자료형을 지정하여 변환하는 것을 명시적 자료형 변환(explicit type conversion, type casting)이라고 하며 변수나 값 앞에 변환할 자료형을 붙인 뒤 ( ) (괄호)로 묶어주면 됩니다.
- (자료형)변수
- (자료형)값
다음 내용을 소스 코드 편집 창에 입력하세요.
type_conversion_variable.c
#include <stdio.h> int main() { int num1 = 32; int num2 = 7; float num3; num3 = num1 / num2; // 컴파일 경고 발생 printf("%f\n", num3); // 4.000000 num3 = (float)num1 / num2; // num1을 float로 변환 printf("%f\n", num3); // 4.571429 return 0; }
실행 결과
4.000000 4.571429
num3 = num1 / num2;와 같이 정수 / 정수를 계산하면 정수(int) 4가 나오고 num3에는 4.0000000이 저장됩니다. 이때 num3은 float형이라 int와 자료형이 달라서 다음과 같이 컴파일 경고가 발생합니다.
컴파일 결과
type_conversion_variable.c(9): warning C4244: '=': 'int'에서 'float'(으)로 변환하면서 데이터가 손실될 수 있습니다.
하지만 num3 = (float)num1 / num2;와 같이 num1을 float로 강제 변환해주면 실수 / 정수가 되어 결과도 실수(float)가 됩니다. 따라서 num3에는 4.571429가 저장되고, 컴파일 경고가 발생하지 않습니다.
이처럼 형 변환은 자료형(타입)을 명확하게 결정할 수 있습니다. 또한, 프로그래머가 의도한 상황일 때 컴파일 경고가 발생하지 않도록 만들 수 있습니다.