만약 자바에서 100자리 이상의 수를 표현해야한다면 어떻게 해야할까?
자바에서 보통 int,long안에서 숫자를 표현할 수 있기때문에 평소에는 크게 문제가 없습니다. 하지만 100자리 이상의 수를 표현해야하는 상황이 생긴다면? 어떻게 해야할까요?🧐 먼저 정석의(?)방법을 알아보기전에 먼저 고민을 해보도록 하겠습니다. 만약 자바에서 100자리 이상의 수를 표현해야하는 상황이 생긴다고 합시다. 어떤 방법을 쓸 수 있을까요?
1. integer를 사용해볼순 없을까?🧐
100자리 이상의 수를 표현하는데는 기본 자료형으로는 불가능합니다. 그렇다면 클래스라면? 클래스인 Integer로는 100자리 이상의 수를 표현할 수 없을까요? integer은 Null값을 가집니다. 즉, null 값을 가지기때문에 기본 자료형인 int와는 다르게 객체라는 의미입니다. 메모리에 더 많은 공간을 차지하는 만큼 더 큰 공간을 가질 수 있지않을까요? Integer 공식 문서를 살펴봅시다.
public final class Integer extends Number implements Comparable<Integer>
The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int.In addition, this class provides several methods for converting an int to a String and a String to an int, as well as other constants and methods useful when dealing with an int.
https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
공식 문서에 따르면 Integer는 int를 감싸는 래퍼 클래스이기때문에 int의 범위와 동일합니다. 즉, Integer는 -2,147,483,648부터 2,147,483,647까지의 정수 값을 가질 수 있습니다. 안타깝게도 래퍼클래스(래퍼 클래스(Wrapper Class)는 Java에서 기본 자료형(primitive type)을 객체 형태로 감싸는 클래스)이기때문에 int의 범위를 벗어날 수 없습니다. 그렇다면 long의 래퍼 클래스인 Long도 똑같은 상황일 것입니다.
그렇다면 자바에서는 어떻게 100의 자리수를 처리하고있을까요?
BigInteger
자바에서는 BigInteger 클래스를 통해 무한대에 가까운 숫자를 계산할 수 있습니다. 공식 문서를 번역해보면 Math 클래스와 비슷한 유사 연산자, 즉 연산 메소드를 제공하는 것으로 보입니다.
BigInteger provides analogues to all of Java's primitive integer operators, and all relevant methods from java.lang.Math.
BigInteger는 Java의 모든 기본 정수 연산자와 java.lang.Math의 모든 관련 메서드에 대한 유사 연산자를 제공합니다
그럼 BigInteger를 선언해보겠습니다.
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger integer = new BigInteger("");
}
}
BigInteger의 특징으로는 초기화시 문자열 String을 매개변수로 받습니다. 숫자를 다루는데 왜 문자열일까요? 실제 동작 방식은 문자열을 통해 이뤄진다는 것입니다. 그렇기때문에 사칙 연산이 되지않습니다. 위에서 말했듯이 BigInteger 안의 내부의 메서드를 사용해야합니다.
BigInteger integer = new BigInteger("100000000000000000");
BigInteger integer2 = new BigInteger("1000000000000000000000000000000000");
integer.add(integer2);
integer.subtract(integer2);
integer.multiply(integer2);
integer.divide(integer2);
integer.remainder(integer2);
그렇다면 혹시모를 경우를 대비해서 평소에도 BingInteger를 쓰는 게 좋을까요?🧐
대답은 아닙니다. 당연하겠지만 BigInteger은 큰 수를 다루는 만큼 성능 면에서 단점이 생기기마련입니다. bigInteger의 단점은 다음과 같습니다.
단점
- 성능: BigInteger는 기본 자료형에 비해 성능이 느립니다. 이는 내부적으로 배열을 사용하여 숫자를 저장하고, 계산 시 더 복잡한 알고리즘을 필요로 하기 때문입니다.
- 메모리 사용량: 기본 자료형보다 훨씬 더 많은 메모리를 소비합니다. 특히 큰 숫자를 다룰 경우 메모리 요구량이 급증할 수 있습니다.
- 코드 복잡성: BigInteger의 사용은 기본형에 비해 더 많은 메서드 호출과 객체 생성이 필요하기 때문에 코드가 복잡해질 수 있습니다.
그럼 언제 BigInteger를 사용하는 게 좋을까요?
- 암호학: 대수적 연산이 필요하고 큰 숫자가 사용되는 암호 알고리즘에서 많이 활용됩니다.
- 수학적 계산: 정밀한 수학적 계산이 필요한 경우, 예를 들어 큰 소수 찾기, 조합 계산 등을 위해 사용됩니다.
- 금융 애플리케이션: 큰 숫자를 다뤄야 하는 금융 계산에서도 유용합니다. 예를 들어, 큰 금액의 통화 변환이나 계산 시 유용합니다.
- 과학적 계산: 큰 수치를 처리해야 하는 과학적 데이터 분석에서도 사용될 수 있습니다.
참고링크
https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
https://learn.microsoft.com/ko-kr/dotnet/api/java.math.biginteger?view=net-android-34.0