..

Search

10) 타입 변환

10) 타입 변환

타입 변환


타입 변환(type conversion)

C언어에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행됩니다.

이처럼 하나의 타입을 다른 타입으로 바꾸는 행위를 타입 변환(type conversion)이라고 합니다.

 

표현 범위가 좁은 타입에서 표현 범위가 더 넓은 타입으로의 타입 변환은 큰 문제가 되지 않습니다.

하지만 반대의 경우인 표현 범위가 좁은 타입으로의 타입 변환에서는 데이터의 손실이 발생합니다.

 

타입 변환은 크게 다음과 같이 두 가지 방식으로 나눌 수 있습니다.

 

1. 묵시적 타입 변환(자동 타입 변환)

2. 명시적 타입 변환(강제 타입 변환)


묵시적 타입 변환(자동 타입 변환, implicit type conversion)

묵시적 타입 변환은 대입 연산이나 산술 연산에서 C 컴파일러가 자동으로 실행해주는 타입 변환을 가리킵니다.

C언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행됩니다.

또한, 산술 연산에서는 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환이 진행됩니다.

 

다음 예제는 대입 연산에서 일어나는 묵시적 타입 변환을 보여줍니다.

예제

char ch = 200;

int num01 = 3.14;

double num02 = 5;  

 

printf("   ch에 저장된 값은 %d입니다.\n", ch);

printf("num01에 저장된 값은 %d입니다.\n", num01);

printf("num02에 저장된 값은 %f입니다.\n", num02);

코딩연습 ▶

실행 결과

   ch에 저장된 값은 -56입니다.

num01에 저장된 값은 3입니다.

num02에 저장된 값은 5.000000입니다.

 

위의 예제에서는 char형 변수에 char형 변수가 표현할 수 있는 범위를 넘는 데이터를 저장합니다.

따라서 전달된 데이터의 상위 비트가 자동으로 삭제되어 데이터의 손실이 발생합니다.

또한, int형 변수에 실수를 저장했기 때문에 소수 부분이 자동으로 삭제되어 데이터의 손실이 발생합니다.

하지만 double형 변수에 int형 데이터를 저장하는 것은 데이터가 double형으로 자동 타입 변환되지만, 데이터의 손실은 발생하지 않습니다.

 

다음 예제는 산술 연산에서 일어나는 묵시적 타입 변환을 보여줍니다.

예제

double result01 = 5 + 3.14;

double result02 = 5.0f + 3.14;  

 

printf("result01에 저장된 값은 %f입니다.\n", result01);

printf("result02에 저장된 값은 %f입니다.\n", result02);  

코딩연습 ▶

실행 결과

result01에 저장된 값은 8.140000입니다.

result02에 저장된 값은 8.140000입니다.

 

위의 예제에서 첫 번째 연산은 int형 데이터와 double형 데이터의 산술 연산입니다. 

따라서 데이터의 손실이 최소화되도록 int형 데이터가 double형 데이터로 자동 타입 변환됩니다.

두 번째 연산은 float형 데이터와 double형 데이터의 산술 연산입니다.

위와 마찬가지로 데이터의 손실이 최소화되도록 float형 데이터가 double형 데이터로 자동 타입 변환됩니다.

 

이렇게 컴파일러가 자동으로 수행하는 타입 변환은 언제나 데이터의 손실이 최소화되는 방향으로 이루어집니다.

따라서 C 컴파일러는 다음과 같은 순서대로 자동 타입 변환을 수행하게 됩니다.

 

char 형 → short 형 → int 형 → long 형 → float 형 → double 형 → long double 형


명시적 타입 변환(강제 타입 변환, explicit type conversion)

명시적 타입 변환은 사용자가 타입 캐스트(type cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환을 가리킵니다.

변환하고자 하는 데이터의 앞에 괄호(())를 추가하고, 그 안에 변환할 타입을 적으면 됩니다.

C언어에서는 이 괄호(())를 타입 캐스트(type cast) 연산자라고 합니다.

 

다음 예제는 명시적 타입 변환을 보여주는 예제입니다.

예제

int num01 = 1;

int num02 = 4;  

 

double result01 = num01 / num02;

double result02 = (double)num01 / num02;  

 

printf("result01에 저장된 값은 %f입니다.\n", result01);

printf("result02에 저장된 값은 %f입니다.\n", result02);

코딩연습 ▶

실행 결과

result01에 저장된 값은 0.000000입니다.

result02에 저장된 값은 0.250000입니다.

 

위의 예제에서 첫 번째 연산의 결괏값은 0.000000으로 출력됩니다.

그 이유는 산술 연산에 대한 결괏값의 타입은 피연산자의 타입과 언제나 일치하기 때문입니다.

즉 int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터로 나옵니다.

따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 double형으로 지정해야만 정확한 결괏값을 얻을 수 있습니다.


연습문제