본문 바로가기

C언어/C언어 문법

[C언어] 형변환 (Type Casting)

728x90
반응형

형 변환

 

변수를 선언한 이후에도 변수의 자료형을 바꾸는 것이 가능하다.

 

이러한 자료형의 변환에는 자동 형 변환과 강제 형 변환 두 가지 종류가 있다.

 

 

 

 

 

 

자동 형 변환

 

자동 형 변환은 하나의 연산식에 들어있는 연산자들의 자료형이 다를 때 자동(묵시적)으로 발생한다.

 

 

 

 

 

 

대입 과정에서의 자동 형 변환

 

우선 대입 과정에서 일어나는 자동 형 변환을 살펴보겠다.

 

double num = 245;

 

위 코드에서 245는 int형 정수이다.

 

그런데 double 형인 num에 대입함으로써 double형 실수 245.000000으로 변환된다.

 

 

 

 

 

마찬가지로 실수인 상수를 정수형 변수에 대입해도 형 변환이 일어난다.

 

int num = 3.1415;

 

위 코드에서는 3.1415 가 정수 int형으로 변환되면서 데이터의 손실이 일어난다.

 

 

 

 

또는 변수끼리의 대입에서도 마찬가지이다.

 

아래 코드에서 num1 은 int형이지만 doubl형 변수인 num2에 대입하면 double형 실수 5.000000으로 변환된다.

 

int num1 = 5;
double num2 = 10.0;
num2 = num1;
 

 

따라서 아래 코드에서 제대로 된 값이 출력되지 않는 것을 확인할 수 있다.

 

num2는 double형 변수이므로 '%d'가 아니라 '%f'를 사용해야 한다.

 

#include <stdio.h>

int main()
{
	int num1 = 5;
	double num2 = 10.0;
	num2 = num1;
	printf("%d", num2);
	return 0;
}
 

 

 

 

 

 

정수의 승격

 

char형과 short형의 정수 연산을 실행할 때 두 가지 자료형은 int형으로 변환되어서 계산된다.

 

int형의 연산이 char형과 short형에 비해 같거나 빠르기 때문인데 요즘 CPU에서는 체감될만한 차이가 나지는 않는다.

 

 

 

 

 

 

 

 

연산 과정에서의 자동 형 변환

 

형 변환은 대입뿐만 아니라 연산 과정에서도 일어나게 된다.

 

연산과정에서의 형 변환은 데이터의 손실을 최소화하는 방향으로 일어난다.

 

예를 들어 실수인 3.15와 정수인 5를 덧셈할 때 3.15를 정수로 바꾸지 않고 5를 실수로 바꿔서 계산한다.

 

따라서 연산과정에서 일어나는 자동 형 변환은 다음 방향으로 진행된다.

 

 

 

 

char과 short는 연산과정에서 정수의 승격에 의하여 int형으로 변환되므로 위 표에 나타나지 않는다.

 

 

 

 

 

 

 

강제 형 변환

 

자동 형 변환은 대입 연산의 전달 과정에서 강제(명시적)로 발생한다.

 

사용자가 원하는 변수의 자료형을 원하는 대로 명시하여 변환시키는 것이다.

 

int형 변수를 강제로 float형 변수로 바꿔서 double형 변수에 대입하는 코드를 작성해 보겠다.

 

int a = 5;
double b = (float)a;

 

 

이렇게 되면 정수형 변수 a가 바로 double형 변수로 변환되지 않고 float형으로 변환된 후에 다시 double형으로 변환된다.

 

 

 

 

이번에는 자동 형 변환에서 작성한 코드를 자동형 변환이 되지 않게 작성해 보겠다.

 

#include <stdio.h>

int main ()
{
    int num1 = 5, num2 = 2;
    double div;
    div = (double)num1/(double)num2;
    
    printf("나눗셈의 결과 : %f", div);
    return 0;
}
 

 

여기서는 num1과 num2 가 이미 실수인 5.000000과 2.000000이다.

 

따라서 'num1/num2'는 실수끼리의 연산이므로 그 값은 2.500000이다.

 

만약 형 변환 없이 코드를 작성했다면 'num1/num2'는 정수형이므로 그 값은 2가 된다.

 

 

 

 

 

 

 

 

 

728x90
반응형