Java (2.3) : 형 변환

NtoZ·2023년 2월 19일
0

Java

목록 보기
6/23
post-thumbnail

☀️형변환(Type Conversion)


⭐1. 자동 형변환

1.1 long과 float 타입 크기

1.2 char과 byte 타입 크기

1.3 연산식 자동 형변환


⭐2. 강제 형변환

⭐2.1 float과 int 형변환 주의점

강제 타입 변환에서 데이터 자체 손실 외에도 또 다른 주의점이 있다.
정수 타입을 실수 타입으로 변환할 때 정밀도 손실을 피해야 한다.
다음 예제를 보자.

int num1 = 123456780;
int num2 = 123456780;
-------------------------
float num3 = num2;	  	  // ⭐정수타입을 실수타입으로 변환
System.out.println(num3); // 1.23456784 * E8
-------------------------
num2 = (int)num3;
System.out.println(num2); // 123456784
-------------------------
int result = num1 - num2;
System.out.println(result); // -4

int 타입 변수 num1과 num2에 동일한 123456780 값을 저장시키고, num2를 float 타입으로 변환시킨 후, 다시 int 타입으로 변환해서 num2에 저장했다.
그리고 num1에서 num2를 뺀 결과를 변수 result에 저장하고 콘솔에 출력한다.
동일한 값을 뺐기 때문에 당연히 0이 출력되어야 할 것이다. 하지만 실행 결과를 보면 엉뚱하게도 0이 나오질 않는다.
이러한 결과가 나온 이유는 int 값을 float 타입으로 자동 변환하면서 문제가 발생했기 때문이다.
float 타입은 다음과 같이 비트 수가 할당되어 있다.

int 값을 손실 없이 float 타입의 값으로 변환할 수 있으려면 가수 23비트로 표현 가능한 값이어야 한다.
하지만 가수(23bit)가 최대로 표현할수 있는 값은 16,777,215(2^24) 이다. 때문에 123,456,780은 23비트로 표현할 수 없기 때문에 근사치로 변환된다.
즉 정밀도 손실이 발생한 것이다.
그래서 위의 코드에서 float 값을 다시 int 타입으로 변환했어도 원래의 int 값을 얻지 못한 것이다.
이에 대한 해결책은 모든 int 값을 실수 타입으로 안전하게 변환시키는 double 타입을 사용하는 것이다.
double 타입은 다음과 같이 가수부가 52비트나 할당되어 있으니 int형을 충분히 커버하고도 남는다.

출처 : inpa 블로그 - 형변환 방법 총정리

2.2 형변환 안전장치

강제 형변환의 문제점인 데이터 손실을 방지하기 위해, 자바는 코드에서 데이터 값을 검사하기 위한 모든 기본 타입에 대해 최대값(max)과 최소값(min)을 다음과 같이 상수로 제공하고 있다. (boolean과 char 타입 제외)

이를 이용하여 어떤 정수값과 실수값을 다른 타입으로 변환하고자 할 때, 변환될 타입의 최소값과 최대값을 벗어나는지 검사하고, 만약 벗어난다면 타입 변환을 하지 않는 식으로 타입 변환 가드를 칠 수 있다.

int i = 128;
if( (i < Byte.MIN_VALUE) || (i > Byte.MAX_VALUE) ) {
	System.out.println("byte 타입으로 변환 할 수 없음"); // 실행 (byte의 최대 크기는 127)
} else {
	byte b = (byte) i;
    System.out.println(b); 
}

자료 :

profile
9에서 0으로, 백엔드 개발블로그

0개의 댓글