본문 바로가기

프로그래밍/C Lang

C언어 강좌 :: 08. 연산 시스템 - 형변환 -


     08. 연산 시스템 :: 형변환




학습 목표


1. 묵시적 형변환이 무엇인지 이해한다.

2. 명시적 형변환을 하는 방법을 학습한다.

3. 데이터 손실이 일어나는 이유를 이해한다.






ㆍ일단 따라해보기


#include <stdio.h>


int main()

{

char a = 5;

int b = 10;


short result = (int)a + b;


printf("result : %d \n",result);

return 0;

}






c언어에서 연산을 수행할 때 피연산자가 두개를 요구한다면 두 피연산자의 자료형은 반드시 같아야합니다. 그러나 실제로 연산식을 작성하다보면 다른 자료형끼리 연산하는 경우도 생기게 됩니다. 예를 들어 char형 변수와 int형 변수를 더하는 경우 두 변수는 자료형이 다르기 때문에 연산이 진행될 수 없습니다. 하지만 실제로는 컴파일도 잘되고 연산도 잘 됩니다. 이유가 무엇일까요? 그이유는 변수의 형변환이 일어났기 때문입니다. 연산시에만 잠깐 다른 자료형인척 하는 것이죠.


이러한 형변환은 묵시적 형변환 명시적 형변환이 있습니다. 묵시적 형변환은 우리가 직접 형변환을 해주지 않아도 컴파일러가 눈치껏 변환시켜주는 것을 의미하고 명시적 형변환은 우리가 직접 형변환을 해주는 것을 의미합니다






ㆍ암묵적 형변환


묵시적 형변환은 컴파일이 진행되는 동안 자동으로 일어납니다. 다음 코드는 묵시적 형변환이 일어나는 예입니다.


char a = 5;

int b = 10;

b = a + b;


변수 a는 char형이고 변수 b는 int형이기 때문에 덧셈연산을 진행하기에 부적절합니다. 이 때 컴파일러는 그것을 알아채고 변수 a를 잠깐 int형으로써 다루게 됩니다.



그렇다고 a의 자료형이 int형이 되는 것이 아닙니다. a의 자료형은 계속 char형입니다. 다만 연산 시 잠깐 다른 자료형으로서 다루어지는 것일 뿐입니다.






ㆍ명시적 형변환


명시적 형변환은 말그대로 형변환을 직접 해주는 것입니다. 아래와 같이 소괄호에 원하는 자료형의 이름을 넣어서 변수이름 앞에 붙여주게 되면 해당 자료형으로서 다루어지게됩니다.


char a = 5;

int b = 10;

b = (int)a + b;


여기서도 마찬가지로 변수 a의 자료형이 변하는 것은 아닙니다. 연산 시에만 잠깐 다른 자료형으로서 다루어지는 것일 뿐입니다.








ㆍ형변환과 데이터 손실


서로 다른 메모리 크기의 자료형을 서로 형변환하게 되면 데이터 손실이 일어나게 됩니다. 예를 들어 int형 자료형을 char형으로 형변환한다고 생각해보세요.







 int x = 2817;

 printf("%d\n",(char)x);


int형 변수는 4바이트 크기로 정수를 표현하지만 char형은 1바이트로 표현되기 때문에 나머지 상위 3바이트는 날아가게 됩니다. 이럴 경우 데이터의 손실이 생기게 되며 경우에 따라서 프로그램에 치명적인 논리 오류를 발생시킬 수 있습니다. 따라서 메모리 크기가 다른 자료형끼리의 형변환시, 데이터의 손실이 발생하지 않도록 주의를 기울이는 습관을 갖는 것이 중요합니다.




ㆍ선호되는 자료형


컴파일러는 기본적으로 연산시에 선호되는 타입이 존재합니다. char형과 int형을 덧셈할 때 int형을 char형으로 형변환하는 것보단 char형을 int형으로 형변환 하는 편이 당연히 메모리 손실이 일어나지 않겠죠? 마찬가지로 실수의 덧셈에서도 float형과 double형의 덧셈시 float형을 double형으로 형변환시킨 후에 연산을 진행하게 됩니다.