[Java] long에서 int로 안전하게 형변환하기

2020. 5. 4. 11:16Dev/Java

300x250
반응형

long to int in Java

  1. intValue() 를 이용한 cast
    1-1) Long to int (using intValue)
    1-2) Nullsafe Long to int (using intValue)
    1-3) long to int (using intValue)
    1-4) intValue 이용시 발생되는 overflow 이슈
  2. Math.toIntExtrac()를 이용한 cast

1. intValue() 를 이용한 cast

1-1) Long to int (using intValue)

Long l1 = 11L;
int i1 = l1.intValue();
System.out.println(l1 +", " +i1);
11, 11

Wrapper 클래스 Long의 intValue() 를 이용하여 int타입으로 형변환할 수 있습니다.

1-2) Nullsafe Long to int (using intValue)

Long l2 = null;
int i2 = Long.valueOf(Optional.ofNullable(l2).orElse(0L)).intValue();
System.out.println(l2 +", " +i2);
null, 0

Long 타입의 경우 null 이 들어있는 경우도 존재합니다.
null을 intValue()를 이용하여 cast를 시도할 경우 NullPointerException을 발생시키기 때문에, 값이 null일 경우에 대한 예외 처리를 추가해야 합니다.

Optional.ofNullable을 이용하여 null이 들어있을 경우
0L으로 바꿔서 Nullsafe하게 만들었습니다.

1-3) long to int (using intValue)

long l3 = 12L;
int i3 = Long.valueOf(l3).intValue();
System.out.println(l3 +", " +i3);
12, 12

primitive long 타입의 경우, intValue() 메서드를 이용할 수 없습니다.
이럴 경우, Long.valueOf() 를 이용하여 Long instance로 변환하여 cast합니다.

1-4) intValue 이용시 발생되는 overflow 이슈

int타입의 범위는 -2147483648 ~ 2147483647 로, 범위 내의 수를 cast할 시 정상적으로 출력됩니다.

long l4 = 2147483649L;
int i4 = Long.valueOf(l4).intValue();
System.out.println(l4 +", " +i4);
2147483649, -2147483647

그러나, 위와같이 int타입의 표현 범위를 초과할 시엔(overflow), -범위로 넘어가 원하지 않는 결과가 출력됩니다.

overflow에 안전한 cast를 제공하기 위해, overflow될 경우 익셉션을 던지도록 합시다.

Math 클래스의 toIntExtrac 메서드를 이용하면 overflow에 안전한 cast를 할 수 있습니다.


2. Math.toIntExtrac()를 이용한 cast

long타입을 int타입으로 cast할 때, int의 표현범위를 초과할 시 ArithmeticException 익셉션을 발생시키는 Math.toIntExact를 알아봅시다.
※ Java 8 이상 버전에서 지원합니다.

long l5 = 2147483649L;
int i5 = Math.toIntExact(l5);
System.out.println(l5 +", " +i5);
Exception in thread "main" java.lang.ArithmeticException: integer overflow
	at java.lang.Math.toIntExact(Unknown Source)
	at me.jiniworld.demo.test.Test.main(Test.java:6)

int로 표현할수 있는 범위를 초과한 값을 cast하려고 할 경우 위와 같은 에러를 던집니다.

또한, 인자값으로 변환대상을 받기 때문에 Wrapper Long타입이나 primitive long타입 모두 입력값으로 받을 수 있습니다.

300x250
반응형