본문 바로가기

Code.D IT 강좌/C언어

[C언어 강좌] 자동 형 변환/강제 형 변환

관련 글

[C언어 강좌] 자료형(정수/실수)의 종류와 크기(sizeof 함수)



C언어 강좌

자료형끼리는 형 변환이 가능합니다.

즉, int형을 double형으로 바꾸고, char형을 int형 등으로 바꿀 수 있다는 소리죠!

형 변환에는 두 가지 종류가 존재합니다.

1. 자동 형 변환

2. 강제 형 변환



자동 형 변환(암시적 형 변환)

데이터 형식(Type)을 자동으로 변환해주는 것을 의미하며,

대입 연산자를 기준으로 오른쪽에서 왼쪽으로 자동 형 변환됩니다.

메모리 크기가 작은 자료형에서 큰 자료형으로 변환되는 것을 우선순위로 둡니다.



크기를 한눈에 비교하면 다음과 같습니다.

char < int < long < float < double < long double

정수형               < 실수형



강제 형 변환(명시적 형 변환)

강제 형 변환은 개발자가 직접 형 변환을 요청하는 것을 의미합니다.



자동으로 형 변환이 일어나는데 굳이 강제적으로 형 변환을 왜 할까요?

이유는, 데이터 손실을 최소화하기 위해서죠.

큰 그릇(큰 자료형)에 담겨 있는 물(데이터)이 작은 그릇(작은 자료형)에 모두 들어간다면 넘치겠죠? 그래서 데이터 손실이 일어나게 됩니다. 데이터 손실은 완전히 막을 순 없습니다.

하지만 강제 형 변환으로 데이터 손실을 최소화할 수 있습니다.



강제 형 변환 시 데이터 손실이 있는 경우와 없는 경우를 비교하여 설명하겠습니다.

데이터 손실이 없는 경우(확장 변환, 프로모션(Promotion))

 작은 자료형에서 큰 자료형으로 전환될 경우 데이터 손실이 발생하지 않습니다.

Ex) int  double 손실 X

데이터 손실이 있는 경우(축소 변환, 디모션(Demotion))

 큰 자료형에서 작은 자료형으로 전환될 경우 데이터 손실이 발생합니다.

Ex) double  int 손실 O



강제 형 변환 형식

(바꿀 자료형) 변수;

Ex) (double)num;

 이처럼 바꿀 자료형을 강제로 () 괄호 안에 기입하게 됩니다.



예를 살펴보겠습니다.



      
      #include <stdio.h>

      int main(void){

     //문자형(작은 자료형)
     char num1 = 130;
     //데이터 손실 발생

     //int(정수형)
     int num2 = 3.14;
     //데이터 손실이 일어남

     //실수형(큰 자료형)
     double num3 = 5;
     printf("%d\n %d\n %lf\n", num1, num2, num3);

     return 0;

}



아래는 출력 결과입니다.





 

char num1 = 130;

→ char의 데이터 범위는 -128 ~ +127인데 130으로 초기화했으므로 데이터 손실이 발생합니다.

int num2 = 3.14; 

 정수형 int는 소수점을 담아내지 못해 데이터 손실이 발생합니다.

double num3 = 5; 

 실수형 double은 정수형의 메모리 크기보다 크기 때문에 정수 5를 초기화해도 데이터 손실이 발생하지 않습니다.



예를 하나 더 살펴보겠습니다.



     #include <stdio.h>

int main(void){ //변수 선언 및 초기화 int num1 = 10; int num2 = 3; //변수 선언 및 초기화 double result; result = num1/num2; //result = 10/3; printf("결과1 : %lf\n", result); // 데이터 손실 발생 //강제 형 변환1 result = (double)num1/num2; printf("결과2 : %lf\n", result); //강제 형 변환2 result = (double)num1/(double)num2; printf("결과3 : %lf\n", result); return 0; }



아래는 출력 결과입니다.






int num1 = 10;

int num2 = 3;

 num1, num2의 변수를 선언하고 초기화합니다.

double result;

result = num1/num2;

 double형으로 result를 선언하고 초기화(result = 10/3)합니다.

printf("결과1: %lf\n", result);

 결과1: 3.000000

→ 결과 값이 3.333333이 나와야 하는데 3.00000이 나옵니다.

 정수(num1)와 정수(num2)를 나눈 결과 값이 사실상 실수인데,

초기화 전 여전히 정수형이므로 정수값이 나옵니다.

result = (double)num1/num2;

 result로 초기화 전 double형으로 강제 형 변환합니다.

→ 데이터 손실을 최소화 하기 위함입니다.