본문 바로가기
JAVA

[JAVA] BigInteger 클래스

by snow_white 2022. 3. 24.

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

 

BigInteger (Java SE 12 & JDK 12 )

Immutable arbitrary-precision integers. All operations behave as if BigIntegers were represented in two's-complement notation (like Java's primitive integer types). BigInteger provides analogues to all of Java's primitive integer operators, and all relevan

docs.oracle.com

 

댓글