더북(TheBook)

033 BigInteger를 원시 타입으로 변환

 

BigInteger 클래스는 불변 임의 정밀도 정수를 표현하는 아주 유용한 도구다.

이 클래스는 BigIntegerbytelong, double 같은 원시 타입으로 변환해주는 메서드(java.lang.Number에서 유래)도 포함한다. 하지만 이러한 메서드는 예상치 못한 결과와 혼란으로 이어질 수 있다. 한 예로 Long.MAX_VALUE를 래핑하는 다음 BigInteger를 가정해보자.

BigInteger nr = BigInteger.valueOf(Long.MAX_VALUE);

BigInteger.longValue() 메서드를 사용해 위 BigInteger를 원시 롱 타입으로 변환해보자.

long nrLong = nr.longValue();

아직까지는 예상대로 동작한다. Long.MAX_VALUE9,223,372,036,854,775,807인데, nrLong 원시 변수도 정확히 이 값이다.

이제 BigInteger.intValue() 메서드로 위 BigInteger 클래스를 int 값으로 변환해보자.

int nrInt = nr.intValue();

이번에는 nrInt 원시 변수 값이 -1이다(shortValue()byteValue()의 결과도 마찬가지다). 공식 문서에 따르면 BigInteger 값이 너무 커 명시한 원시 타입에 들어가지 않는 경우 낮은 차수의 비트 n개만 반환한다(이때 n은 명시한 원시 타입에 따라 다르다). 코드에 이러한 명세를 반영하지 않으면 이어지는 계산에 -1 값이 들어가 혼란이 생긴다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.