특정 서비스에서 아주 큰 정수를 다뤄야 할 경우가 있을 수 있다.

 

이런 경우 일반적으로 정수를 담는 int 또는 long 변수에 담아서 연산하려고 할 때

 

intlong이 수용 가능한 정수의 범위 인데

int (-2,147,483,648 ~ 2,147,483,647 *약 21억)

long (-9,223,372,036,854,775,808 ~ 9,22 3,372,036,854,775,807 * 922경)

 

만약 int에 담기 어려울 때 , long이 꽤 큰 범위의 정수를 담을 수 있어서 괜찮은 거 아닌가?

 

라고 생각할 수 있겠지만, 아래 처럼 직접 값을 담아보면 저렇게 에러가 발생한다

long은 922경 까지 담을 수 있다고 한거 아니였어?

 

문제는 위 처럼 Java에서 '숫자 리터럴'을 변수에 담을 때에

 

기본적으로 int로 처리를 시도하는데 (자동형변환)

 

200억은 int의 범위를 넘어서는 숫자이기 때문에 컴파일 에러를 발생시킨다.

 

이런 경우 아래 처럼 숫자 리터럴 뒤에 "L" 또는 "l"을 붙여서 명시적으로 long으로 처리하게 하면 된다.

 

문제는 실제 서비스에서 정수 값이 작은 수 부터 아주 큰 수까지 다양한 값이 올 수 있다는 가정을 하면

 

서버단으로 숫자 데이터를 넘겨받을 때 정수의 크기와 관계없이 무조건 long 변수에 담은 뒤

 

(정수가 long 범위를 벗어나지 않는다는 가정하에) 나머지 처리를 해도 되고

 

혹은 처리해야 할 정수 값이 아주 아주 클 경우 BigInteger 클래스를 이용해서 값을 담고, 필요한 연산을 처리한 뒤

 

그 결과 값(정수) 숫자의 크기를 체크하여 알맞는 범위의 변수에 담아 나머지 처리를 해도 된다.

 

서비스 유형 및 어떤 상황에서 사용되는 로직인지 어느 쪽이 효율적일지 판단하여 선택적으로 구현하면 될 것 같다.

 

// BigInteger 클래스를 활용하여 큰 정수 데이터 다루기


import java.math.BigInteger; // java의 math 패키지에 속한 클래스

// 아주 큰 정수
BigInteger bigInt1 = new BigInteger("123456789012345678901234567890");
BigInteger bigInt2 = new BigInteger("987654321098765432109876543210");

BigInteger addInt = bigInt1.add(bigInt2); // 더하기 연산

BigInteger subtractInt = bigInt1.subtract(bigInt2); // 빼기 연산

BigInteger multiplyInt = bigInt1.multiply(bigInt2); // 곱하기 연산

BigInteger divideInt = bigInt1.divide(bigInt2); // 나누기 연산

int comparison = bigInt1.compareTo(bigInt2); // 아주 두 큰 수를 서로 비교

/* 두 수 비교 시 변수에 담기는 값의 의미
comparison : -1 => bigInt1이 bigInt2보다 작음을 나타냄
comparison : 0 => bigInt1과 bigInt2가 같음을 나타냄
comparison : 1 => bigInt1이 bigInt2보다 큼을 나타냄
*/

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기