033 BigInteger를 원시 타입으로 변환
BigInteger 클래스는 불변 임의 정밀도 정수를 표현하는 아주 유용한 도구다.
이 클래스는 BigInteger를 byte나 long, double 같은 원시 타입으로 변환해주는 메서드(java.lang.Number에서 유래)도 포함한다. 하지만 이러한 메서드는 예상치 못한 결과와 혼란으로 이어질 수 있다. 한 예로 Long.MAX_VALUE를 래핑하는 다음 BigInteger를 가정해보자.
BigInteger nr = BigInteger.valueOf(Long.MAX_VALUE);
BigInteger.longValue() 메서드를 사용해 위 BigInteger를 원시 롱 타입으로 변환해보자.
long nrLong = nr.longValue();
아직까지는 예상대로 동작한다. Long.MAX_VALUE가 9,223,372,036,854,775,807인데, nrLong 원시 변수도 정확히 이 값이다.
이제 BigInteger.intValue() 메서드로 위 BigInteger 클래스를 int 값으로 변환해보자.
int nrInt = nr.intValue();
이번에는 nrInt 원시 변수 값이 -1이다(shortValue()와 byteValue()의 결과도 마찬가지다). 공식 문서에 따르면 BigInteger 값이 너무 커 명시한 원시 타입에 들어가지 않는 경우 낮은 차수의 비트 n개만 반환한다(이때 n은 명시한 원시 타입에 따라 다르다). 코드에 이러한 명세를 반영하지 않으면 이어지는 계산에 -1 값이 들어가 혼란이 생긴다.