❐ Description
오늘은 3주차 과제를 하면서 구글링을 통해 알게된 부분들을 총 정리해볼 것이다.
참고 문서들이 너무 잘 정리되어 있기 때문에 별도의 포스팅으로 쓰진 않고,
참고한 아티클을 정리 및 요약을 통해 내 것으로 만들 것이다.
❐ BigDecimal
‣ BigDecimal A to Z: 정확한 계산을 위한 숫자 처리 클래스
‣ DecimalFormat/NumberFormat 사용시 주의점
1. 부동 소수점 & 고정 소수점
BigDecimal을 알기 전에 부동 소수점과 고정 소수점에 대해서 알고 넘어가야 한다.
부동 소수점(Floating-point)은 숫자를 저장할 때 지수(exponent)와 유효 숫자(significand)를
사용하여 표현한다. 이 방식은 숫자의 크기에 비례하여 소수점 위치를 조정할 수 있기 때문에,
매우 큰 수나 매우 작은 수를 표현할 수 있다는 장점이 있다. IEEE 754 표준을 기반으로 일반적으로
32비트(float)와 64비트(double)형식으로 표현된다. 부동 소수점은 가변적인 소수점 자릿수를
가지며 연산 속도가 빠르지만, 연산 과정에서 정밀도 손실이 발생할 수 있다.
고정 소수점(Fixed-point)은 숫자를 저장할 때 소수점 위치가 고정되어 있다. 이는 주로 소수점 자릿수를
미리 정의한 상태에서 숫자를 표현하기 때문에, 부동 소수점에 비해 정밀한 계산이 요구되는 상황에 유리하다.
고정 소수점 방식은 일반적으로 금융 계산 등에서 많이 사용되며, 소수점 위치가 고정되어 있기 때문에 메모리
효율성이나 연산 속도에서 제약이 있을 수 있지만, 정밀도 손실이 발생하지 않는 장점이 있다.
2. Java의 BigDecimal
Java의 BigDecimal 클래스는 고정 소수점과 유사한 정확한 숫자 표현을 위해 설계되었다. BigDecimal은 정밀도
손실이 발생하지 않도록 설계되어 있기 때문에 금융 계산과 같이 정밀도가 중요한 경우에 주로 사용된다.
BigDecimal은 내부적으로 숫자를 문자열 형태로 저장하여 모든 자리수를 정확하게 표현한다. 이는 부동 소수점에서
발생하는 정밀도 손실을 피할 수 있도록 돕는다.
BigDecimal은 부동 소수점 방식의 float나 double에 비해 속도는 느리지만, 고정 소수점과 유사하게 정밀하고
안정적인 계산을 가능하게 해준다. 따라서 BigDecimal을 사용할 경우 소수점의 자리수와 무관하게 정확한 결과를
기대할 수 있다.
3. Formatting 시 주의할 점
DecimalFormat df = new DecimalFormat("#,###.00");
double rnd = 112399.405d;
System.out.println(df.format(rnd)); // 112,399.40
DecimalFormat df = new DecimalFormat("#,###.00%");
double rnd = 112399.405d;
System.out.println(df.format(rnd)); // 11,239,940.50%
format을 정의할 때 %를 붙이면 자동을 100을 곱해준다.
자동으로 100을 곱하고 싶지 않다면 아래와 같이 할 수 있다.
DecimalFormat df = new DecimalFormat("#,###.00'%'");
double rnd = 112399.405d;
System.out.println(df.format(rnd)); // 112,399.40%
❐ BinarySearch Vs Contains
로또 번호를 맞출 때 binarySearch를 사용할지 contains를 사용할지 고민했었다.
이에 관한 글을 요약하면 아래와 같다.
1. binarySearch vs contains
binarySearch 메서드는 정렬된 리스트에서 이진 탐색을 수행하여 특정 요소를 찾는다.
이 메서드는 O(log n)의 시간 복잡도를 가지므로, 리스트가 이미 정렬되어 있다면 빠르게 요소를 찾을 수 있다.
contains 메서드는 리스트 내의 요소를 처음부터 순차적으로 검사하는 순차 탐색 방식이다. 정렬 여부와 상관없이
리스트를 하나씩 확인하기 때문에 O(n)의 시간 복잡도를 가집니다.
2. 정렬 여부에 따른 성능 차이
정렬된 리스트에서는 binarySearch가 contains보다 훨씬 빠르다.
binarySearch는 log n의 시간 복잡도를 가지므로 큰 리스트에서도 빠른 탐색이 가능하다.
정렬되지 않은 리스트에서는 binarySearch를 사용할 수 없다.
이 경우 contains를 사용할 수밖에 없으며, 이때 성능은 O(n)이 된다.
3. 리스트의 크기와 성능 영향
• 작은 크기의 리스트에서는 두 메서드 간의 성능 차이가 크지 않을 수 있다.
• 리스트 크기가 클수록 binarySearch는 contains에 비해 더 효율적이다.
'우테코 7기 > 3주차' 카테고리의 다른 글
정적 팩토리 메소드 왜 쓰는걸까? (0) | 2024.11.04 |
---|---|
Map의 computeXxx 메소드를 알아보자. (0) | 2024.11.03 |
EnumMap을 쓰는 이유 (0) | 2024.11.03 |
3주차 회고 (0) | 2024.11.03 |
로또 (0) | 2024.11.03 |