Java에서 int의 메모리 크기는 4byte로 표현할 수 있는 범위는 -2,147,483,648 ~ 2,147,483,647이다. long의 메모리 크기는 8byte로 표현할 수 있는 범위는 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807이다.
이 때 이 범위를 넘어서게 되면 모두 0으로 출력이 된다. 숫자의 범위가 저 범위를 넘는 경우는 거의 없겠지만, 돈과 관련된 개발, 혹은 알고리즘 문제를 풀 때 항상 최악의 상황을 고려해야하므로 무한의 정수가 들어갈 가능성이 있는 경우 BigInteger 클래스를 활용하는 것이 좋다. BigInteger는 문자열 형태로 이루어져 있어, 숫자의 범위가 무한하기 때문에 어떠한 정수인지 담을 수 있다.
//문자열로부터 BigInteger 생성
BigInteger num1 = new BigInteger("12345678901234567890");
// long 값으로부터 BigInteger 생성
BigInteger num2 = BigInteger.valueOf(1234567890);
BigInteger를 초기화 하기 위해서는 문자열을 인자값으로 넘겨줘야한다. BigInteger는 문자열로 되어있기 때문이다.
BigInteger sum = num1.add(num2); // 덧셈
BigInteger difference = num1.subtract(num2); // 뺄셈
BigInteger product = num1.multiply(num2); // 곱셈
BigInteger quotient = num1.divide(num2); // 나눗셈
BigInteger remainder = num1.remainder(num2); // 나머지
BigInteger bigInt = new BigInteger("12345678901234567890");
int intValue = bigInt.intValue(); // BigInteger를 int로 변환
long longValue = bigInt.longValue(); // BigInteger를 long으로 변환
주의할 점은, BigInteger의 크기가 기본 데이터 타입의 허용 범위를 벗어나게 되면 데이터 손실이 발생할 가능성이 있다. 따라서 안전하게 형변환을 하기 위해서는 BigInteger 객체의 크기가 기본 데이터 타입의 허용 범위에 있는지 확인하는 것이 중요하다.
int result = num1.compareTo(num2);
위의 예시에서 result가 음수이면, num1이 num2보다 작고, 양수이면 num1이 num2보다 크다. 0일 때는 두 수가 같은 것을 의미한다.
BigInteger result = num1.pow(2); // num1을 제곱한 결과
BigInteger 클래스는 정수 계산에서 발생할 수 있는 오버플로우나 정밀도 손실을 피할 수 있도록 하므로, 매우 큰 정수나 정밀한 연산이 필요한 상황에서 사용할 수 있다.