본문 바로가기
Language/Java

[Java] 형변환(casting)

by 계범 2022. 2. 28.

형변환(캐스팅,casting)이란?

변수 또는 리터럴의 타입을 다른 타입으로 변환 시키는 것.

 

int 타입 값 + float 타입 값을 더할 경우, 먼저 두 값을 같은 타입으로 형변환 해야함.

 

형변환 방법

(타입) 피연산자 // (int)d;

형변환하고자 하는 변수 또는 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주면 된다.

 

여기서 사용하는 괄호()는 '캐스트 연산자' 또는 '형변환 연산자'라고 하며,

형변환을 '캐스팅(casting)'이라고도 한다.

 

피연산자인 변수 d의 값은 형변환 후에도 변화 없다.

 

정수형 간의 형변환

큰 타입에서 작은 타입으로의 변환하는 경우 크기의 차이만큼 잘려나간다.

그래서 경우에 따라 '값 손실(loss of data)'가 발생할 수 있다.

 

int -> byte

00000000000000000000000100101100 (int 32)

                                         101100 (byte 8)

 

300이란 숫자가 byte로 형변환하면 44만 남는다.(앞에 부분은 다 날라감)

 

작은 타입에서 큰 타입으로 형변환의 경우 값손실이 없다.

 

실수형 간의 형변환

실수형도 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간을 0으로 채운다.

지수는 float의 bias인 127을 double 1023으로 더해서 변환하고, 가수는 float의 23자리를 채우고 남은 자리를 0으로 채운다.

 

큰타입에서 작은타입으로 변환하는 경우,

지수는 float bias 127로 변경하고, 가수는 double 가수 52 자리 중 23자리만 저장되고 나머지는 버려진다.

만약, 24번째 자리의 값이 1이면, 반올림이 발생하여 23번째 자리의 값이 1증가한다.

 

 float 타입의 범위를 넘는 값을 double로 형변환 하는 경우, '무한대' 또는 '0'을 결과로 얻는다.

 

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

정수형을 실수형으로 변환

정수는 소수점이하의 값이 없으므로 비교적 변환이 간단하다.

 

정수를 2진수로 변환한다음 정규화를 거쳐(부동 소수점 형태) 실수의 저장형식으로 저장될 뿐이다.

 

한가지 문제점은 정밀도로 인한 오차가 발생할 수 있다.

int의 경우 약 20억(10^10이상) 최대 10자리의 정밀도를 요구하는데, float의 경우 7자리의 정밀도를 제공하므로,

double을 써야 오차가 발생하지 않는다.(double은 15자리 정밀도)

 

실수형을 정수형으로 변환

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

반올림이 아니라, 내림처리이다.

 

만약, 실수가 정수형의 저장범위를 넘을 경우, 오버플로우가 발생한 결과를 얻는다.

 

자동 형변환

다른 타입간의 대입이나 연산을 할 때, 경우에 따라 편의상의 이유로 형변환을 생략할 수 있다.

컴파일러가 생략된 형변환을 자동적으로 추가한다.

 

자동 형변환의 규칙

  • 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
  • boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
  • 기본형과 참조형은 서로 형변환할 수 없다.

 

에러 발생 사유

  1. 변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하려는 경우
    • incompatible types: possible lossy conversion from int to byte 에러 발생
    • 큰 타입에서 작은 타입으로의 형변환은 값 손실 발생할 수 있다는 뜻.
    • 타입을 직접 적은 명시적 형변환의 경우, 에러가 발생하지 않음. (char) 1000;

 

참조

'Java의 정석' 책

댓글