[Java] 산술변환

Hoplin·2023년 1월 1일
0

Java 형변환 순서

Java에서 형변환 이라는 개념이 있다. 그리고 자바의 형변환에는 형변환 순서라는 것이 존재한다

이 순서는 기본적으로 작은 타입에서 큰 타입으로 형변환을 하는 경우를 의미한다. 산술변환에 대해 보기 앞서, 한가지 의문점이 들만한 점이있다. 바로 8Byte long 타입이 왜 더 작은 4Byte float으로 형변환된다는 것이다.

Java의 실수형

기초적인 내용으로 접근해 보자. Java 역시 Primitive Data Type이 존재하고, 실수형으로는 float와 double이 존재한다. 그리고 이 float와 double은 부동소수점방식으로 실수를 표현한다.(IEEE 754,참고) float와 double의 표현 범위는 아래와 같다.(양수범위만 의미하며, 음수범위는 해당 범위에 -를 붙이면 됨)

Type범위정밀도크기
float1.4 x 10^-45 ~ 3.4 x 10^287자리32비트, 4바이트
double4.9 x 10^-324 ~ 1.8 x 10^30815자리64비트, 8바이트

float와 int의 저장 방식에는 차이가 존재한다.

여기서 'S' 는 부호비트를 의미한다. int타입 같은 경우 부호비트와 값 두 파트로 이루어져 있다면, float같은 경우에는, 부호(S), 지수(E), 가수(M) 세 부분으로 이루어져 있다. 이는 아래와 같은 형태로 저장하기 때문이다.

(+ or -) M x 2^E

위 표에서 정밀도 라는 것은 a x 10^n(1<= a < 10)의 형태로 표현된 7자리의 10진수를 오차없이 저장할 수 있다라는 의미이다. 7자리 이상의 정밀도가 필요하다면, 변수 타입을 double로 변경해야하며, 실수형을 저장할 때 double로 하는 이유는 값의 범위의 이유가 아닌 높은 정밀도라는 이유에서이다.(단 메모리 크기가 2배가 나므로, 공간복잡도를 고려했을때는 float를 우선순위로 둔다.) 결론적으로 7자리 이상의 int가 float로 형변환 후 다시 int로 형변환 하면, 원래의 값으로 되돌아오는것을 보장하지 못한다는 것이다.

다시 산술변환으로

이항 연산자는 두 피연산자의 타입이 일치해야 한다. 그렇기 때문에 자바는 연산을 하기 전에 피연산자간에 타입이 다른 경우, 자동으로 형변환을 하여 타입을 일치시킨다. 그리고 형변환은 위에서 보았던 형변환 순서를 고려하여 형변환이 되게 된다. 산술 변환 규칙에는 두개의 규칙이 있다.

  1. 두 피연산자의 타입을 같게 일치 (더 큰 타입으로)
  • long + int -> long + long = long (int 보다 long이 더 크다)
  • float + int -> float + float = float (float이 int보다 더 크다)
  • double + float -> double + double = double (double이 float보다 더 크다)
  1. 피연산자의 값이 int보다 작은 값인 경우, int로 형변환 된다.
  • byte + short -> int + int = int
  • char + short -> int + int = int

이렇게 하는 이유는 부동소수점을 봤을때처럼, 값 손실 최소화Overflow 방지를 위해서가 대표적인 이유이다.

profile
더 나은 내일을 위해 오늘의 중괄호를 엽니다

1개의 댓글

comment-user-thumbnail
2023년 1월 2일

감사합니다.

답글 달기