BigInteger, BigDecimal

https://inpa.tistory.com/entry/JAVA-%E2%98%95-BigInteger-BigDecimal-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%B4%9D%EC%A0%95%EB%A6%AC

BigInteger

BigInteger 클래스는 매우 큰 정수 값을 처리하기 위한 클래스이다. 이 클래스는 내부적으로 2진수로 표현이 되며, 자바에서 기본적으로 제공하는 int나 long 타입의 크기를 초과하는 정수 값을 처리 할 수 있다.

 

BigInteger 클래스의 생성자

BigInteger 클래스는 다양한 방법으로 객체를 생성할 수 있다. 그 중에서도 가장 일반적인 방법은 아래와 같다. 

BigInteger bi1 = new BigInteger("12345678901234567890");
BigInteger bi2 = BigInteger.valueOf(1234567890);

위 코드에서 bi1 객체는 문자열 "12345678901234567890"을 BigInteger 객체로 변환하여 생성하고, bi2 객체는 int 값 1234567890을 BigIntefer 객체로 변환하여 생성하고 있다. 

 

BigInteger 클래스의 메서드

BigInteger 클래스는 다양한 메서드를 제공한다. 

  • add(BigInteger val) : 두 BigInteger 객체를 더합니다.
  • subtract(BigInteger val) : 두 BigInteger 객체를 뺍니다.
  • multiply(BigInteger val) : 두 BigInteger 객체를 곱합니다.
  • divide(BigInteger val) : 두 BigInteger 객체를 나눕니다.
  • remainder(BigInteger val) : 나눈 후 나머지를 구합니다.
  • pow(int exponent) : BigInteger 객체의 거듭제곱 값을 구합니다.
  • compareTo(BigInteger val) : 두 BigInteger 객체를 비교합니다.
import java.math.BigInteger;

public class BigIntegerExample {
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("12345678901234567890");
        BigInteger bi2 = BigInteger.valueOf(9876543210L);

        System.out.println(bi1.add(bi2));      // 12345678911111111100
        System.out.println(bi1.subtract(bi2)); // 12345678901224691380
        System.out.println(bi1.multiply(bi2)); // 121932631137021985988589876543210
        System.out.println(bi1.divide(bi2));   // 1249871
        System.out.println(bi1.remainder(bi2)); // 5354883090
        System.out.println(bi1.pow(3));        // 18816763774341817660241843116748917312835671120000000000000000000
        System.out.println(bi1.compareTo(bi2));// 1
    }
}

BigDecimal

BigDecimal 클래스는 매우 큰 실수 값을 처리하기 위한 클래스이다. 이 클래스는 내부적으로 10진수로 표현되며, 정확한 계산을 위해 BigDecimal 값을 다룰 때는 꼭 문자열을 사용하여 생성해야 한다.

 

BigDecimal 클래스의 생성자

BigDecimal 클래스는 다양한 방법으로 객체를 생성할 수 있다. 그 중에서도 가장 일반적인 방법은 다음과 같다. 

BigDecimal bd1 = new BigDecimal("1234567890.1234567890");
BigDecimal bd2 = BigDecimal.valueOf(1234567890.1234567890);

위 코드에서 bd1 객체는 문자열 "1234567890.1234567890"을 BigDecimal 객체로 변환하여 생성하고, bd2 객체는 double 값 1234567890.1234567890을 BigDecimal 객체로 변환하여 생성한다.

 

BigDecimal 클래스의 메서드

BigDecimal 클래스는 다양한 메서드를 제공하고 있다.

  • add(BigDecimal val) : 두 BigDecimal 객체를 더합니다.
  • subtract(BigDecimal val) : 두 BigDecimal 객체를 뺍니다.
  • multiply(BigDecimal val) : 두 BigDecimal 객체를 곱합니다.
  • divide(BigDecimal val, int scale, RoundingMode mode) : 두 BigDecimal 객체를 나눕니다.
  • remainder(BigDecimal val) : 나눈 후 나머지를 구합니다.
  • pow(int exponent) : BigDecimal 객체의 거듭제곱 값을 구합니다.
  • compareTo(BigDecimal val) : 두 BigDecimal 객체를 비교합니다.
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal("1234567890.1234567890");
        BigDecimal bd2 = BigDecimal.valueOf(9876543210.9876543210);

        System.out.println(bd1.add(bd2));      // 11111111101.111111110
        System.out.println(bd1.subtract(bd2)); // -8641975320.864197532
        System.out.println(bd1.multiply(bd2)); // 12193263113702198582.179875855586289
        System.out.println(bd1.divide(bd2, 5, RoundingMode.HALF_UP)); // 0.12497
        System.out.println(bd1.remainder(bd2)); // 1234567890.123456789
        System.out.println(bd1.pow(3));        // 1881676377434181766024414490003627689.027754159300506721
        System.out.println(bd1.compareTo(bd2));// -1
    }
}

위 예제에서 BigDecimal 클래스의 divide 메서드를 호출할 때, 세 번째 인자로 RoundingMode.Half_UP을 넘겨주어 반올림을 하도록 설정하였다. 이렇게 하면 결과값이 정확하게 반올림되어 출력된다. 


결론

BigIntger와 BigDecimal 클래스는 자바에서 매우 큰 정수와 실수 값을 다룰 때 유용하다. 하지만, 이 클래스들은 내부적으로 문자열을 사용하기 때문에 다른 기본 자료형에 비해 속도가 느릴 수 있다. 또한, 연산에서 사용되는 메모리 크기가 매우 크기 때문에, 메모리 사용량을 줄이기 위해서는 다른 자료형들보다 더 신중한 사용이 필요하다.

'Language > Java' 카테고리의 다른 글

JVM GC(Garbage Collection)  (0) 2023.04.13
JVM(Java Virtual Machine)  (0) 2023.04.03
StringTokenizer, StringBuilder, StringBuffer  (0) 2023.03.27
정규식(Regular Expression)  (0) 2023.03.25
(Java)10진법 <--> n집법 변환  (0) 2023.03.16