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 암시적 변환과 형 변환

형 확장은 값의 손실이 없으므로 컴파일러가 알아서 처리할 수 있습니다. 하지만 형 축소는 값의 손실이 발생하여 컴파일러가 알아서 처리할 수 없으므로 경고가 발생합니다. 따라서 형 변환으로 의도를 밝혀야만 컴파일러가 안심하고 변환을 하게 됩니다. 즉, 형 변환은 컴파일러에게 자료형을 변환한다는 의도를 명확하게 알려주는 것입니다.

특히, 형 변환은 구조체와 포인터를 조합하여 사용할 때 유용하게 활용됩니다.

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이 저장됩니다. 이때 num3float형이라 int와 자료형이 달라서 다음과 같이 컴파일 경고가 발생합니다.

컴파일 결과

type_conversion_variable.c(9): warning C4244: '=': 'int'에서 'float'(으)로 변환하면서 데이터가 손실될 수 있습니다.

하지만 num3 = (float)num1 / num2;와 같이 num1float로 강제 변환해주면 실수 / 정수가 되어 결과도 실수(float)가 됩니다. 따라서 num3에는 4.571429가 저장되고, 컴파일 경고가 발생하지 않습니다.

이처럼 형 변환은 자료형(타입)을 명확하게 결정할 수 있습니다. 또한, 프로그래머가 의도한 상황일 때 컴파일 경고가 발생하지 않도록 만들 수 있습니다.