BOJ 하노이의 탑 문제를 푸는 도중 계속해서 실패의 결과를 얻었다.
다양하게 시도해보니 N이 30만 넘어가도 2147483647의 결과만 출력하는 것을 알게 되었다.
이 수는 4비트 int(정수)형에서 나타낼 수 있는 가장 큰 수라고 알고 있다..
오버플로우가 발생하여 계속 답이 틀리다는 것이었고, 해결 방법을 찾아보니 BigInteger 클래스를 활용하면 숫자의 범위가 무한하기 때문에 어떤 숫자든 담을 수 있다고 한다.
따라서 오늘은 BigInteger 클래스 활용법에 대해 알아보도록 할 것이다.
BigInteger
BigInteger 클래스는 java.math 패키지 안에 있으며 클래스에 선언된 변경할 수 없는 임의 정밀도 정수이다.
클래스 이름에서 알 수 있듯이 기본 int형으로 나타낼 수 있는 -2147483648 ~ 2147483647(2^31-1) 까지의 범위를 넘어서 더 큰 정수를 나타낼 수 있다.
물론 long형 역시 더 큰 범위이지만 2^61-1까지 나타낼 수 있다. 모두 제한적인 범위 탓에 무한한 크기의 숫자를 담을 수는 없다.
BigInteger의 필드
필드 | 설명 |
ONE |
BigInteger 상수입니다.
|
TEN |
BigInteger 상수 10입니다.
|
TWO |
BigInteger 상수 2입니다.
|
ZERO |
BigInteger 상수 0입니다.
|
BigInteger 생성자
BigInteger의 인스턴스를 생성하기 위해서는 보통 문자열을 기반으로 생성한다. 하지만 아래와 같이 16진수를 10진수로, 2진수를 10진수로 변환하여 생성할 수도 있다.
import java.math.BigInteger;
public class BigIntegerTest {
public static void main(String[] args) {
// 10진수 64를 10진수로 변환
BigInteger bigIntWithRadix10 = new BigInteger("64", 10); // 64
System.out.println(bigIntWithRadix10);
// 2진수 1010을 10진수로 변환
BigInteger bigIntWithRadix2 = new BigInteger("1010", 2); // 10
System.out.println(bigIntWithRadix2);
// 16진수 64를 10진수로 변환
BigInteger bigIntWithRadix16 = new BigInteger("64", 16); // 100
System.out.println(bigIntWithRadix16);
// 정수로 생성
BigInteger bigIntWithValue = BigInteger.valueOf(123); // 123
System.out.println(bigIntWithValue);
// 문자열로 생성
BigInteger bigIntWithString = new BigInteger("12345"); // 12345
System.out.println(bigIntWithString);
}
}
BigInteger의 사칙연산
BigInteger은 문자열이기에 사칙연산이 안 된다. 따라서 BigIntger 내부의 숫자를 계산하기 위해서는 BigIntger 클래스 내부에 있는 메서드를 사용해야 한다.
- 더하기(add)
- 빼기(subtract)
- 곱하기(multiply)
- 나누기(divide)
- 나머지구하기(remainder)
import java.math.BigInteger;
public class BigIntegerTest {
public static void main(String[] args) {
BigInteger bigNumber1 = new BigInteger("25");
BigInteger bigNumber2 = new BigInteger("10");
System.out.println("25 + 10 :" +bigNumber1.add(bigNumber2));
System.out.println("25 - 10 :" +bigNumber1.subtract(bigNumber2));
System.out.println("25 * 10 :" +bigNumber1.multiply(bigNumber2));
System.out.println("25 / 10 :" +bigNumber1.divide(bigNumber2));
System.out.println("25 % 10 :" +bigNumber1.remainder(bigNumber2));
}
}
>> 출력 결과
25 + 10 :35
25 - 10 :15
25 * 10 :250
25 / 10 :2
25 % 10 :5
BigInteger의 형변환
BigInteger 클래스를 기본 자료형으로 형변환을 할 때 아래의 메소드를 사용한다.
import java.math.BigInteger;
public class BigIntegerTest {
public static void main(String[] args) {
BigInteger bigNumber = BigInteger.valueOf(100000); //int -> BigIntger
int int_bigNum = bigNumber.intValue();
long long_bigNum = bigNumber.longValue();
float float_bigNum = bigNumber.floatValue();
double double_bigNum = bigNumber.doubleValue();
String String_bigNum = bigNumber.toString();
System.out.println("BigIntger -> int : "+int_bigNum+" , type : "+((Object)int_bigNum).getClass().getSimpleName());
System.out.println("BigIntger -> long : "+int_bigNum+" , type : "+((Object)int_bigNum).getClass().getSimpleName());
System.out.println("BigIntger -> float : "+int_bigNum+" , type : "+((Object)int_bigNum).getClass().getSimpleName());
System.out.println("BigIntger -> double : "+int_bigNum+" , type : "+((Object)int_bigNum).getClass().getSimpleName());
System.out.println("BigIntger -> double : "+int_bigNum+" , type : "+String_bigNum.getClass().getSimpleName());
}
}
>> 출력 결과
BigIntger -> int : 100000 , type : Integer
BigIntger -> long : 100000 , type : Integer
BigIntger -> float : 100000 , type : Integer
BigIntger -> double : 100000 , type : Integer
BigIntger -> double : 100000 , type : String
BigInteger의 수 비교
import java.math.BigInteger;
public class BigIntegerTest {
public static void main(String[] args) {
BigInteger bigInt1 = new BigInteger("12345");
BigInteger bigInt2 = new BigInteger("12345");
BigInteger bigInt3 = new BigInteger("54321");
boolean equals = bigInt1.equals(bigInt2);
System.out.println("bigInt1과 bigInt2이 같은가? " + equals);
equals = bigInt2.equals(bigInt3);
System.out.println("bigInt2과 bigInt3이 같은가? " + equals);
BigInteger value = BigInteger.TEN;
System.out.println(value.compareTo(BigInteger.ZERO)); // 1
System.out.println(value.compareTo(BigInteger.TEN)); // 0
}
}
>> 출력 결과
bigInt1과 bigInt2이 같은가? true
bigInt2과 bigInt3이 같은가? false
1
0
BigInteger의 그 외 메소드
반환형 | 메소드 | 설명 |
BigInteger | abs() |
값이 이 BigInteger의 절대값인 BigInteger를 반환합니다.
|
BigInteger | max(BigInteger val) |
파라미터로 전달되는 값과 비교하여 최댓값을 반환합니다.
|
BigInteger | min(BigInteger val) |
파라미터로 전달되는 값과 비교하여 최소값을 반환합니다.
|
BigInteger | sqrt() |
정수 제곱근을 반환합니다.
|
https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/math/BigInteger.html
'JAVA' 카테고리의 다른 글
아임포트(i'mport) 결제 기능 구현하기 (0) | 2023.05.09 |
---|---|
[Eclipse] github와 eclipse 연동 중 rejected-non-fast-forward 오류 (0) | 2022.06.15 |
[JAVA] Comparable과 Comparator (0) | 2022.03.13 |
[JAVA] 원시타입(Primitive Type) / 참조타입(Reference Type) (0) | 2022.03.13 |
[JAVA] StringBuffer, StringBuilder 클래스 (0) | 2022.01.24 |
댓글