본문 바로가기
Old Posts/Java

[Java] 오버플로우 없이 정수 다루기 - BigInteger 사용법 및 예제

by A6K 2021. 6. 23.

Java 혹은 C를 이용해서 프로그래밍하다보면 '오버플로우(Overflow)'라는 개념을 기억하고 있어야한다. 정수형 타입의 데이터를 저장하기 위해서 4바이트의 int 변수를 선언하게 된다. 문제는 int 타입의 변수는 -2,147,483,648 ~ 2,147,483,647 사이의 값만 저장할 수 있다는 점이다. 좀 더 큰 수를 저장하기 위해서 long 타입으로 선언하더라도 그 범위가 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807로 늘어날 뿐 모든 범위의 숫자를 정확하게 저장할 수 있는 것은 아니다

일반적인 경우라면 이 정도 범위의 숫자만으로도 문제가 없겠지만 과학 데이터를 다루는 프로그램이나 데이터의 숫자가 대륙의 스케일로 넘어가버리면 문제가 생기는 경우도 발생한다.

1. BigInteger 

자바에서는 이런 정수 타입의 저장 한계를 극복하기 위해서 BigInteger 클래스를 제공하고 있다. BigInteger 클래스는 정수를 문자열 형태로 저장하기 때문에 메모리가 부족하지 않은 이상 무한한 숫자를 저장할 수 있다.

2. BigInteger 사용법

2.1 BigInteger 선언

BigInteger bigInteger1 = new BigInteger("1234");
BigInteger bigInteger2 = BigInteger.valueOf("1234");

BigInteger 클래스는 'java.math' 패키지에 선언되어 있다. BigInteger 객체를 생성하기 위해 생성자에 만들려고하는 숫자를 문자열 형태로 넘겨주면 된다.

2.2 BigInteger 연산

BigIntger 클래스는 사칙연산과 나머지 연산을 메소드 형태로 제공하고 있다. 일반 int, long 변수처럼 '+', '-', '*', '/', '%' 연산을 사용하면 안된다.

BigInteger bigInteger1 = new BigInteger("123");
BigInteger bigInteger2 = new BigInteger("234");

// 더하기
System.out.println(bigInteger1.add(bigInteger2));
// 빼기
System.out.println(bigInteger1.subtract(bigInteger2));
// 곱하기
System.out.println(bigInteger1.multiply(bigInteger2));
// 나누기
System.out.println(bigInteger1.divide(bigInteger2));
// 나머지
System.out.println(bigInteger1.remainder(bigInteger2));

이 메소드들은 또 다른 BigInteger 객체를 리턴한다.

2.3 BigInteger 타입 변환

BigInteger 클래스는 기본적으로 객체 형태로 다뤄진다. 따라서 특정 타입으로 타입 변환을 해야하는 경우가 있다.

BigInteger bigInteger = new BigInteger("123");

int intNum = bigInteger.intValue(); // int 타입으로 변환
long longNum = bigInteger.longValue(); // long 타입으로 변환
float floatNum = bigInteger.floatValue(); // float 타입으로 변환
double doubleNum = bigInteger.doubleValue(); // double 타입으로 변환
String stringValue = bigInteger.toString(); // 문자열 타입으로 변환

2.4 BigInteger 비교

사칙 연산처럼 두 숫자의 비교 연산 역시 그대로 사용할 수 없고, 별도의 메소드를 통해서 사용해야한다.

BigInteger bigInteger1 = new BigInteger("7777");
BigInteger bigInteger2 = new BigInteger("8888");
		
// 같으면 0, 입력한 인자가 더 크면 -1, 입력한 인자가 더 작으면 +1
int compare = bigInteger2.compareTo(bigInteger2);
System.out.println(compare);

 

댓글