코딩 노트

05-4 자료형의 변환 본문

C

05-4 자료형의 변환

newbyeol 2021. 5. 6. 16:08

자료형의 변환이란 데이터의 표현방식을 바꾸는 것이다.

ex) char형으로 표현되어 있는 데이터의 표현방식을 int형으로 바꾸거나, int형을 double형으로 바꾸는 것

자료형의 변환은 크게 두 종류로 나뉘는데, 자동 형 변환(묵시적 형 변환)과 강제 형 변환(명시적 형 변환)이다. 그 이름이 의미하듯이 '자동 형 변환'은 자동으로 발생하는 형 변환이고, '강제 형 변환'은 프로그래머가 형 변환을 명시해서 강제로 변환이 일어나게 하는 것이다.

 

1. 대입연산의 전달과정에서 발생하는 자동 형 변환

대입 연산자의 왼편과 오른편에 존재하는 두 피연산자의 자료형이 일치하지 않으면, 왼편에 있는 피연산자를 대상으로 형 변환이 자동으로 일어난다. (저장소의 자료형에 맞춰서 형 변환이 일어나야 값의 저장이 가능하므로)

 

double num1=245;    // int형 정수 245를 double형으로 자동 형 변환 (double형 실수 245.0으로 변환되어서 저장됨)

 

int num2=3.1415;     // double형 실수 3.1415를 int형으로 자동 형 변환(int형 정수 3으로 변환되면서 소수부의 손실 발생)

 

int num3=129;

char ch=num3;    // int형 변수 129를 char형으로 자동 형 변환(-127로 변환되면서 상위 바이트 손실 발생)

이 데이터를 변수 ch에 저장하기 위해서는 1바이트 크기로 줄여야하는데, 그렇게 되면 상위 바이트의 손실로 인해서 부호가 바뀐다.

 

2. '정수의 승격(Integral Promotion)'에 의한 자동 형 변환

이러한 형태의 형번환을 가리켜 위 언급한 것처럼 '정수의 승격'이라 하는데 위의 코드에서는 정수의 승격만 일어난 게 아니다. num1 + num2의 계산 결과는 4바이트 크기의 int형 정수이다. 따라서 이 값을 변수 num3에 저장하기 위해서, 앞서 언급한 대입연산 과정에서의 형 변환이 다시 일어나게 된다.

3. 피연산자의 자료형 불일치로 발생하는 자동 형 변환

5.15를 정수로 변환하여 5가 되어 소수부의 손실이 발생하는 것보다, 19를 실수로 변환하여 19.0이 되어 덧셈을 하는 것이 오차가 존재해도 정확한 연산의 결과를 볼 수 있기 때문에 int형 정수를 double형 실수로 형 변환이 이루어진다.

 

위 규칙 그림에서 char와 short가 보이지 않는 이유는 '정수의 승격'에 의해서 둘 다 int형 정수로 변환되기 때문에 생략된 것이다.

또, 4바이트 크기의 float가 8바이트 크기의 long long보다 형 변환 우선순위가 높은데 그 이유는 long long형 데이터가 float형으로 형 변환이 될 경우, 데이터의 손실은 생각만큼 크지 않다. 비록 오차는 존재하지만 표현할 수 있는 값의 범위는 float가 더 넓기 때문이다. 반면, float형 데이터가 long long형으로 형 변환될 경우에는 '소수부의 손실'이 발생하기 때문에 거의 100% 손실이 발생한다고 봐야한다. 

4. 명시적 형 변환: 강제로 일으키는 형 변환

명시적 형 변환이란, 형 변환 연산자를 이용해서 강제로 형 변환을 명령하는 것을 의미한다.

 

나눗셈의 결과로 0.75가 출력될 수 있다고 생각할 수 있지만, 연산결과의 자료형은 피연산자의 자료형과 일치하기 때문에, 나눗셈의 결과는 0이 되고(정수형 나눗셈 결과의 몫), 이 값이 double형으로 자동 형 변환되어 변수 divResult에 저장된다. 따라서 위와 같은 출력결과를 보인 것이다.

하지만 여기에 

divResult = (double)num1 / num2;

로 변경해서 실행한다면 0.75가 출력된다. C언어에서의 소괄호는 연산의 순서를 지정하기 위해서도 사용되지만(수학적 의미), 형 변환을 명령할 때에도 사용이 된다. 즉, (double)num1은 변수 num1에 저장된 값을 double형으로 변환하라는 뜻이다. 따라서 이렇게 사용되는 소괄호를 가리켜 형 변환 연산자(type casting operator)라 하며, 연산의 결과로는 변환된 값이 반환된다. 즉, 위의 문장에서 제일 먼저 진행되는 연산은 형 변환 연산이고,

divResult = 3.0 / num2;

그 다음 나눗셈을 진행할 차례인데, 산술 연산의 형 변환 규칙에 의해 num2에 저장된 값도 double형으로 자동 형 변환된다.

divResult = 3.0 / 4.0;

그리고 마지막으로 나눗셈이 진행되고 그 결과가 변수 divResult에 저장된다.