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
*/
'Java' 카테고리의 다른 글
Gradle 로 Junit 5 테스트 할 수 있도록 빌드 하기 (0) | 2021.10.26 |
---|---|
String:: 비어있는 문자열인지 체크 하는 두 개의 메소드 비교 ( isEmpty vs isBlank ) (0) | 2021.10.25 |
Java Packages & API 사용하기 (0) | 2021.07.06 |
Java tutorial (0) | 2021.07.02 |