BigInteger 다루기

들어가기 전, BigInteger Java SE 7 공식문서coding-factory에서 참고하여 적은 것임을 밝힙니다.

 

BigInteger를 사용해야 하는 이유

우리가 프로그램을 만들 때 조건에 의해 굉장히 큰 수의 셈이 필요한 경우가 있다. int나 long의 범위만 해도 넘을 경우가는 잘 없겠지만, 변수의 정수 표현 범위를 넘어서게 되면 0이나 내가 의도하지 않았던 값으로 출력된다. 우리는 최악의 경우를 고려해야 하므로, 무한의 정수가 들어갈 가능성이 있다면 BigInteger는 사용할 수 있는 좋은 선택지이라 하겠다.

BigInteger는 int, long, Integer, Long과 달리 문자열 형태로 숫자를 처리하므로 아무리 큰 수라도 담을 수 있다.

 

타입 범위 메모리 크기 (64bit 기준) 기본/참조형 저장된 위치
int -2,147,483,648 ~ 2,147,483,647 4 Byte 기본형 Stack
long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 8 Byte 기본형 Stack
BigInteger 무한 (Infinity) Minimum 70 Byte 참조형 Heap
  • BigInteger는 표현하고자 하는 자리수에 비례하여 사용하는 메모리 크기가 늘어난다.
  • BigInteger의 메모리 크기는 최소 사이즈인 70 Byte일 때는 BigInteger를 "7" 과 같이 한 자리 수로만 사용할 때의 메모리 크기이다.
  • Stackoverflow의 한 문답에 따르면 64-bit JVM을 기준으로 1 digit (=자리수)일 때 70 Byte, 20 digit일 때 80 Byte, 100 digit이면 112 Byte 정도 된다고 한다. Long이 24 Byte이고 long이 8 Byte임을 생각하면 3배에서 10배 정도의 크기이다.
  • 무한이 아닌지 조건을 생각해보고 곰곰히 사용해야 하겠다.

 

BigInteger 사용법

선언

import java.math.BigInteger;

BigInteger bigNumber = new BigInteger("10001");
  • BigInteger는 java.math 안에 있으며 위와 같이 선언 가능하다.
  • 주의할 점은 BigInteger를 초기화하기 위해서 문자열을 인자 값으로 넘겨주어야 한다는 점이다. BigInteger의 공식 문서을 보면 byte[]와 Random 변수를 사용해서 2진수를 활용한 선언, 범위 안에서 랜덤한 수를 지정하는 선언도 사용할 수 있다.

 

 

사칙연산

BigInteger bigNumber1 = new BigInteger("100000");
BigInteger bigNumber2 = new BigInteger("10000");

System.out.println("덧셈(+) :" +bigNumber1.add(bigNumber2));
System.out.println("뺄셈(-) :" +bigNumber1.subtract(bigNumber2));
System.out.println("곱셈(*) :" +bigNumber1.multiply(bigNumber2));
System.out.println("나눗셈(/) :" +bigNumber1.divide(bigNumber2));
System.out.println("나머지(%) :" +bigNumber1.remainder(bigNumber2));

/*
  덧셈(+) :110000
  뺄셈(-) :90000
  곱셈(*) :1000000000
  나눗셈(/) :10
  나머지(%) :0
 */
  • BigInteger은 문자열이기에 사칙연산이 안된다. 그렇기에 BigIntger 내부의 숫자를 계산하기 위해서는 BigIntger 클래스 내부에 있는 메서드를 사용해야 한다.

 

 

형 변환

BigInteger 클래스를 기본 타입으로 형 변환을 해야할 경우

BigInteger bigNumber = BigInteger.valueOf(100000); //int -> BigIntger

int int_bigNum = bigNumber.intValue(); //BigIntger -> int
long long_bigNum = bigNumber.longValue(); //BigIntger -> long
float float_bigNum = bigNumber.floatValue(); //BigIntger -> float
double double_bigNum = bigNumber.doubleValue(); //BigIntger -> double
String String_bigNum = bigNumber.toString(); //BigIntger -> String

 

2개의 수 비교

비교시엔 compareTo를 사용한다.

BigInteger bigNumber1 = new BigInteger("100000");
BigInteger bigNumber2 = new BigInteger("1000000");
		
int compare = bigNumber1.compareTo(bigNumber2);

 

우리가 알고 있는 CompareTo 리턴 값과 동일하게, 1, 0, -1로 표현된다.

BigInteger bigNumber1 = new BigInteger("50");
BigInteger bigNumber2 = new BigInteger("1000");
BigInteger bigNumber2_same = new BigInteger("1000");

int compare = bigNumber1.compareTo(bigNumber2);
System.out.println("작은 수를 큰 수랑 비교 할 때 : " + compare); // -1
int compare2 = bigNumber2.compareTo(bigNumber2_same);
System.out.println("2개의 수가 같을 때 : " + compare2); // 0
int compare3 = bigNumber2.compareTo(bigNumber1);
System.out.println("큰 수를 작은 수랑 비교할 때 : " + compare3); // 1 

/*
큰 수를 작은 수랑 비교 할 때 : -1
작은 수를 큰 수랑 비교할 때 : 1
2개의 수가 같을 때 : 0
*/

+ Recent posts