[Java] BigInteger로 초대형 정수 처리하기

기록하기·2025년 2월 11일

Java

목록 보기
6/9
자료형범위 (십진수)최대 값 크기 (10ⁿ 기준)
int-2^31 ~ 2^31-1 (약 ±21억)n ≤ 9 (10억 이하)
long-2^63 ~ 2^63-1 (약 ±9경)n ≤ 18
BigInteger제한 없음 (메모리가 허용하는 한 무한대)n > 18

1. BigInteger란?

  • Java에서 기본 제공하는 정수형 자료형(int, long)으로 표현할 수 없는 초대형 정수를 다룰 수 있는 클래스이다
  • 메모리가 허용하는 한 무한대 크기의 정수를 저장할 수 있다
  • 불변 객체(Immutable Object) 로 연산할 때도 기존 값이 변경되지 않고 새로운 BigInteger 객체가 생성된다
  • double과 달리 정확한 정수 연산이 가능해 부동소수점 오차 가 없다
  • +, -, *, / 같은 기본 연산자 대신 메서드로 연산 해야 한다

2. 사용 예시

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        BigInteger x = new BigInteger("123456789012345678901234567890");
        System.out.println(x); // 123456789012345678901234567890
    }
}

3. 연산 메서드

연산메서드
덧셈add(BigInteger val)
뺄셈subtract(BigInteger val)
곱셈multiply(BigInteger val)
나눗셈divide(BigInteger val)
나머지mod(BigInteger val)
제곱pow(int n)
최대공약수(GCD)gcd(BigInteger val)
비교compareTo(BigInteger val)
절댓값abs()

사용 예시

import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        BigInteger num1 = new BigInteger("987654321987654321987654321");
        BigInteger num2 = new BigInteger("123456789123456789123456789");

        BigInteger sum = num1.add(num2);       // 덧셈
        BigInteger subtract = num1.subtract(num2); // 뺄셈
        BigInteger multiply = num1.multiply(num2); // 곱셈
        BigInteger divide = num1.divide(num2);  // 나눗셈
        BigInteger mod = num1.mod(num2);    // 나머지

        System.out.println("덧셈: " + sum);
        System.out.println("뺄셈: " + subtract);
        System.out.println("곱셈: " + multiply);
        System.out.println("나눗셈: " + divide);
        System.out.println("나머지: " + mod);
    }
}

4. 주요 메서드

✅ 요약

주요 메소드설명
compareTo(BigInteger)두 수 크기 비교
gcd(BigInteger)최대공약수(GCD) 계산
mod(BigInteger)나머지 연산
pow(int exponent)거듭제곱 연산
isProbablePrime(int)소수 판별
toString(int radix)특정 진법 문자열 변환
abs()절댓값 반환
negate()부호 반전
bitCount()이진수의 1 개수 반환

1. compareTo(BigInteger val)

BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("200");

int result = a.compareTo(b); // 결과: -1 (a < b)

설명 : ab를 비교하여 결과를 반환
시그니처 : public int compareTo(BigInteger val)
매개변수 : val - 비교할 BigInteger
사용 상황 : 두 수의 대소 비교가 필요할 때 (a < b, a > b, a == b 판단 가능)

2. gcd(BigInteger val)

BigInteger a = new BigInteger("48");
BigInteger b = new BigInteger("18");

BigInteger result = a.gcd(b); // 결과: 6

설명 : 두 수의 최대공약수(GCD, Greatest Common Divisor) 계산
시그니처 : public BigInteger gcd(BigInteger val)
매개변수 : val - 최대공약수를 구할 BigInteger
사용 상황 : 유클리드 호제법을 사용하여 최대공약수를 구할 때

3. mod(BigInteger m)

BigInteger a = new BigInteger("10");
BigInteger b = new BigInteger("3");

BigInteger result = a.mod(b); // 결과: 1

설명 : ab로 나눈 나머지를 반환
시그니처 : public BigInteger mod(BigInteger m)
매개변수 : m - 나눌 값
사용 상황 : 나머지 연산이 필요할 때 (예: 모듈러 연산, 암호학 등)

4. pow(int exponent)

BigInteger a = new BigInteger("2");

BigInteger result = a.pow(10); // 결과: 1024

설명 : aexponent 거듭제곱 계산
시그니처 : public BigInteger pow(int exponent)
매개변수 : exponent - 거듭제곱 할 지수
사용 상황 : 큰 수의 거듭제곱 연산이 필요할 때

5. isProbablePrime(int certainty)

BigInteger a = new BigInteger("17");

boolean isPrime = a.isProbablePrime(10); // 결과: true

설명 : 주어진 숫자가 소수인지 확률적으로 판별
시그니처 : public boolean isProbablePrime(int certainty)
매개변수 : certainty - 소수 판별 신뢰도 (값이 클수록 정확함)
사용 상황 : 암호학, 소수 판별 문제 등

6. toString(int radix)

BigInteger a = new BigInteger("255");

String binaryStr = a.toString(2); // 결과: "11111111"
String hexStr = a.toString(16);   // 결과: "ff"

설명 : BigInteger를 특정 진법(2진수, 16진수 등) 문자열로 변환
시그니처 : public String toString(int radix)
매개변수 : radix - 변환할 진법 (예: 2, 8, 16 등)
사용 상황 : 숫자를 이진수, 16진수 등으로 변환할 때

7. abs()

BigInteger a = new BigInteger("-100");

BigInteger absNum = a.abs(); // 결과: 100

설명 : BigInteger절댓값을 반환
시그니처 : public BigInteger abs()
매개변수 : 없음
사용 상황 : 음수를 양수로 변환할 때

8. negate()

BigInteger a = new BigInteger("100");

BigInteger negNum = a.negate(); // 결과: -100

설명 : BigInteger의 부호를 반전 (양수 → 음수, 음수 → 양수)
시그니처 : public BigInteger negate()
매개변수 : 없음
사용 상황 : 부호를 바꿔야 할 때

9. bitCount()

BigInteger a = new BigInteger("15"); // 1111 (2진수)

int count = a.bitCount(); // 결과: 4

설명 : BigInteger이진수 표현에서 1의 개수 반환
시그니처 : public int bitCount()
매개변수 : 없음
사용 상황 : 이진수 내 1의 개수를 셀 때 (비트마스킹 활용 가능)

‼️ 주의할 점

  • 연산할 때마다 새로운 객체가 생성 됨 → 연산이 많으면 성능이 저하 될 수 있다
  • 소수점 이 필요하면 BigDecimal을 사용해야 한다
  • toString()을 사용하여 출력해야 제대로 된 값을 확인할 수 있다

0개의 댓글