1️⃣ BigInteger
오늘 알고리즘 문제를 풀다가 알게 된 유용한 클래스이다.
말 그대로 매우 큰 수에 대한 연산을 수행할 수 있도록 도와준다.
기존 정수형 자료형인 'int' 의 범위를 보자.
Data Type | Range |
short (2byte) | -32,768 ~ 32,767 |
int (4byte) | -2,147,483,648 ~ 2,147,483,647 |
long (8byte) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
물론 큰 수에 대해서 'long' 타입을 사용하면 가능할 수 있지만, 무한대와 같은 큰 수는 어떻게 다룰까?
바로 java.math 안에 내장된 'BigInteger' 타입을 사용하는 것이다.
https://www.acmicpc.net/problem/10757
이 문제는 백준 알고리즘 문제로, 큰 수에 대한 덧셈을 구하는 문제이다.
예시를 들기 위해 가져왔으며 문제 풀이는 알고리즘 카테고리에 따로 올리겠다.
2️⃣ 선언
BigInteger 사용을 위해 다음과 같이 선언하면 되겠다.
import java.math.BigInteger
public class Main{
public static void main(String[] args){
BigInteger num = new BigInteger("");
}
}
한 가지 이상한 점이 있다.
분명 Integer 인데, 초기화시 인자로 문자열을 받는다. 즉, String 타입으로 받겠다는 말이다.
여기서 BigInteger 의 비밀이 풀린다.
실제 동작 방식은 문자열을 통해 이뤄진다는 것이다.
3️⃣ 연산
그렇다면 BigInteger 타입은 연산이 안될까?
아니다. 친히 자바에서 제공해주는 메소드를 사용해주면 된다.
BigInteger num1 = new BigInteger("100000");
BigInteger num2 = new BigInteger("1000");
System.out.println("num1+num2= " + num1.add(num2));
System.out.println("num1-num2= " + num1.subtract(num2));
System.out.println("num1*num2= " + num1.multiply(num2));
System.out.println("num1/num2= " + num1.divide(num2));
System.out.println("num1%num2= " + num1.remainder(num2));
차례대로 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 나타낸 코드이다.
정리하자면
BigInteger type A , B 에 대해
1. A + B = A.add(B)
2. A - B = A.subtract(B)
3. A * B = A.multiply(B)
4. A / B = A.divide(B)
5. A % B = A.remainder(B)
4️⃣ 형변환
필요에 따라 BigInteger type 을 다른 type 으로 형변환 해야할 수도 있다.
이 때 역시 자바에서 제공하는 메소드를 사용하면 된다.
BigInteger num = new BigInteger("10000"); // 선언
int int_num = num.intValue(); // int
long long_num = num.longValue(); // long
float f_num = num.floatValue(); // float
double d_num = num.doubleValue(); // double
String s_num = num.toString(); // String
쉽게 말해 원하는 '변수명.자료형+Value()' 의 형식으로 형변환을 하면 된다.
번외로 정수형을 BigInteger type 으로 바꾸고 싶다면, 다음과 같이 하면 된다.
Biginteger num = BigInteger.valueOf(1000);
즉, BigInteger.valueOf() 의 인자로 정수형을 받으면 된다.
꽤 유용한 자료형을 알게 되었다.
나중에 알고리즘 문제를 풀거나 범위가 큰 데이터를 다룰 때 유용하게 사용할 수 있겠다.