🔍 BigInteger, BigDecimal 클래스
- java.math 패키지
- 수치데이터를 처리하는 부가적인 클래스
- 아주 큰 정수 또는 실수를 저장하거나, 실수의 문제점을 해결하는 용도로 사용한다
✍ BigInteger 클래스
- 정수의 최대 크기(long 타입이라고 가정)는 약 922경 인데, 이보다 크거나 작은 정수는 취급이 불가능한 문제가 생긴다.
이를 해결하기위해 별도로 추가된 클래스이다.
- 객체 생성 시 파라미터로 전달할 정수는 "문자열" 형태로 전달한다.
- 정수 데이터를 내부적으로 int[] 타입으로 관리한다.
- toString() 메서드가 오버라이딩 되어 있다.
- 일반적은 산술연산자를 사용한 연산은 불가능하며 반드시 메서드를 통해 연산 한다.
=> add(), substract(), multiply(), devide() 등 산술 연산 메서드를 제공한다.
- 기본 데이터타입으로 변환을 위해 xxxValue() 메서드를 사용한다.
=> xxx는 기본 데이터 타입의 이름이다.
=> 각 기본 데이터 타입 크기에 따라 오버플로우가 발생하여 올바르지 못 한 데이터가 저장될 수 있다!
BigInteger bi = new BigInteger("9999999999999999999999999999");
System.out.println("저장된 숫자: " + bi);
int num = bi.intValue(); // 기본 데이터 타입으로 변환
System.out.println(num);
=> long 타입 범위보다 더 큰 정수를 문자열 형태로 전달할 수 있다.
BigInteger에 저장된 문자열의 값을 기본 데이터 타입 정수형으로 변환하기 위해 intValut() 메서드를 사용했다.
이때 오버플로우 발생 가능성이 있다.
💻
저장된 문자열이 기본 데이터 타입으로 정상적으로 출력된 걸 확인할 수 있다.
BigInteger bi = new BigInteger("9999999999999999999999999999");
System.out.println("저장된 숫자: " + bi);
int num = bi.intValue();
BigInteger bi2 = new BigInteger("55555555555555555555");
System.out.println(bi.add(bi2)); // 덧셈
System.out.println(bi.subtract(bi2)); // 뺄셈
System.out.println(bi.multiply(bi2)); // 곱셈
System.out.println(bi.divide(bi2)); // 나눗셈(몫)
System.out.println(bi.remainder(bi2)); // 나눗셈(나머지)
System.out.println(bi.mod(bi2)); // 나눗셈(나머지)
=> BigInteger 클래스를 1개 더 만들어 변수 bi2에 저장하였다.
메서드를 이용하여 bi와 bi2의 연산결과를 출력하였다.
나눗셈 연산을 위한 메서드는 여러가지가 존재한다.
divide()는 몫, remainder()와 mod()는 둘 다 나머지를 구하는 연산이다.
이때 mod()는 나머지 연산에서 두번째 피연산자가 음수일 경우 예외가 발생할 수 있기에 remainder()와 차이가 있다.
✍ BigDecimal 클래스
- 실수 기본형 데이터타입을 확장한 클래스
- 실수 표현 방식으로 인한 정확도의 문제를 해결하기 위해 만들어진 클래스이다
- 실수 데이터를 내부적으로 char[] 타입으로 관리한다.
- 주의!!!!!!!!! 객체 생성 시 기본 데이터타입(float 또는 double)을 사용할 경우 값의 정확도가 떨어질 수 있으므로
문자열 형태로 생성하는 것을 추천한다.
- 기본적인 사용법(메서드)은 BigInteger 클래스와 거의 동일하다
double d1 = 2.0;
double d2 = 1.1;
System.out.println(d1);
System.out.println(d2);
System.out.println(d1 - d2); // 오차 발생
=> 일반적인 double 타입의 연산이다. 우리는 당연히 0.9의 결과가 나올것이라 예상하지만
실제로는 오차가 발생하여, 예상한 결과가 출력되지 않는다.
이런 문제를 해결하기 위해 BigDecimal 클래스를 이용한다.
double d1 = 2.0;
double d2 = 1.1;
BigDecimal bc1 = new BigDecimal("2.0");
BigDecimal bc2 = new BigDecimal("1.1");
System.out.println(bc1.subtract(bc2));
=> BigDecimal 인스턴스를 생성하고 반드시 "문자열"로 값을 저장해준다.
기본 double 타입도 저장 자체는 가능하지만, 정확한 실수가 저장되지 않는다.
문자열로 저장 시 정확한 실수가 저장될 수 있다.
이번에도 메서들 이용하여 연산결과를 살펴보면
오차없이 정상적으로 출력되었다.
++)
기본 데이터 타입인 실수형 변수 데이터를 문자열로 변환하여 BigDecimal 객체 생성하는 방법
double d3 = 1.1;
BigDecimal bc3 = new BigDecimal(d3 + ""); // 널스트링과 결합
BigDecimal bc3 = new BigDecimal(Double.toString(d3)); // toString()사용
BigDecimal bc3 = new BigDecimal(String.valueOf(d3)); // valueOf() 사용
System.out.println(bc3);
기본형 double 타입 변수 d3을 BigDecimal 객체로 변환한다.
그 후 널스트링과 결합, toString, valueOf() 메서드 사용을 통해 값을 출력할 수 있다.
'개발 > Java' 카테고리의 다른 글
[Java] 케이크 먹기 (0) | 2023.03.23 |
---|---|
[MVC] ActionForward 클래스 (0) | 2023.03.23 |
[Java] 스트림(Stream) (0) | 2023.03.15 |
[Java] 람다식 (Lambda Expressions) (0) | 2023.03.15 |
[Java] StringBuilder & StringBuffer (0) | 2023.03.11 |