글 작성자: 개발자 올라프

개요

  • 형변환 하는 것은 간단하지만 '값 손실' 일어나는 부분이 잘 이해가지 않았다. 형변환 내용을 간단하게 정리하고 값 손실은 어떻게 일어나는지 살펴보자.

 


 

형변환

변수 또는 상수의 타입을 다른 타입으로 변환하는 것.

프로그램을 작성 시 값의 대입이나 연산을 수행할 때 같은 타입끼리만 가능하다. 서로 다른 타입 간의 연산을 수행해야 할 때는 연산을 수행하기 전 타입을 일치시켜야 한다. 일치시키기 위해서 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 '형변환'이라고 한다.

 

형변환이 어떤 것인지 쉽게 이해하기 위한 대표적인 예시로 물을 큰 그릇과 작은 그릇 사이에서 옮긴다는 가정이 있다.

  1. 타입의 크기가 1byte, 2byte, 4byte, 8byte으로 제각각인 것처럼 서로 크기가 다른 그릇이 있다고 생각해보자.
  2. 큰 그릇의 물을 작은 그릇으로 옮겨 담는 데 큰 그릇의 물이 작은 그릇의 물보다 많다면 넘치게 되지만 작은 그릇의 물보다 적다면 물은 그대로 보존된다. (데이터손실)
  3. 작은 그릇의 물을 큰 그릇으로 옮겨 담으면 그릇의 물 양에 상관없이 물의 양은 보존된다. (데이터손실X)

이처럼 형변환은 서로 크기가 다른 데이터 타입으로 옮겨 담는 것이라고 생각하면 된다.

 


 

형변환 공식

(타입)피연산자
  • 기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.
  • 기본형과 참조형간의 형변환은 불가능하다.
  • 자동형변환과 강제형변환 두 가지가 있다.

 

int a = 65;
char b = (char)a;
System.out.println(b); //결과 : A
System.out.println(a); //결과 : 65
  • 형변환 연산자는 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환할 뿐 피연산자의 값은 형변환 후에도 아무런 변화가 없음.
  • a를 출력해보면 65가 그대로 출력되어 형변환 후에도 피연산자에는 아무런 변화가 없음을 확인할 수 있다.

 


 

정수형간, 실수형간의 형변환

(1) 정수형

위의 큰 그릇에서 작은 그릇으로 옮기는 예시를 형변환에 대입해보면, int타입(4byte)의 값을 byte타입(1byte)으로 변환하는 경우 int가 보다 큰 값을 가지고 있다면 '값 손실(loss data)'이 발생한다.

반대로 작은 타입에서 큰 타입으로의 변환은 저장공간의 부족으로 잘려나가는 일이 없으므로 값 손실이 발생하지 않는다. 나머지 빈 공간은 변환하려는 값이 양수인 경우 0, 변환하려는 값이 음수인 경우 1로 채워진다.

 

(2) 실수형 (추후 공부 후 재작성 예정)

double타입(8byte)의 값을 float타입(4byte)으로 변환하는 경우 가수 52자리 중 23자리만 저장되고 나머지는 버려진다.

float타입의 범위를 넘는 값을 float으로 형변환하는 경우는 +-무한대 또는 +-0을 결과로 얻게된다.

++추후 추가 공부할 것

float기저 / double기저 - 지수(E) 부분의 변화

 


 

정수형과 실수형 간의 형변환

(1) 정수형을 실수형으로

실수형은 정수형보다 훨씬 큰 저장 범위를 갖기 때문에, 정수형을 실수형으로 변환하는 것은 별 무리가 없지만 실수형의 정밀도 제한으로 인한 오차가 발생할 수 있다.

 

예를 들어 int의 최댓값은 약 20억으로 최대 10자리의 정밀도를 요구하는데 float은 10진수로 약 7자리의 정밀도를 제공하여 정밀도 차이에 의한 오차가 발생할 수 있다. 그래서 10진수로 8자리 이상의 값을 실수형으로 변환할 때는 float가 아닌 double(15자리 정밀도)로 형변환해야 오차가 발생하지 않을 것이다.

 

 

(2) 실수형을 정수형으로

실수형을 정수형으로 변환하면, 실수형의 소수점 이하 값은 버려진다. 

실수의 소수점을 버리고 남은 정수가 정수형의 저장 범위를 넘은 경우는 오버플로우가 발생한다.

 


 

자동 형변환

서로 다른 타입간의 대입이나 연산을 할 때, 형변환으로 타입을 일치시키는 것이 원칙이지만 편의상의 이유로 생략하고 컴파일러가 자동으로 추가해주는 경우가 있다.

 

기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다. 앞서 봤듯이 표현 범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 표현범위가 더 넓은 쪽으로 형변환된다.

왼쪽에서 오른쪽으로의 변환은 자동 형변환이 일어나며 반대 방향으로의 변환은 강제 형변환을 해주어야 한다. 즉, 개발자가 직접 형변환 연산자를 사용하여야 한다.

실수형의 경우 소수점까지 표현하기 때문에 정수형보다 표현 범위는 크다고 할 수 있다. 다만 값의 크기는 정수형이 더 클 수 있으므로 형변환하는 경우 오차가 발생할 수 있다는 것을 주의해야 한다.