[Java] Item 59 : 라이브러리를 익히고 사용하라
Effective Java를 읽고 정리한 정리본입니다.
📌 Item 59 : 라이브러리를 익히고 사용하라
🫧 라이브러리를 잘 모르고 사용하면 발생하는 일 - Ex, Random Library
무작위 정수 하나를 생성하고 싶다고 가정하자.
값의 범위는 0부터 명시한 수 사이다.
static Random rnd = new Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
이 코드에는 괜찮은 듯 보여도 문제를 세 가지나 가지고 있다.
- n이 그리 크지 않은 2의 제곱수라면 같은 수열이 반복될 것이다.
- n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
- n값이 크면 이 현상은 두드러진다.
그러면 다음과 같은 코드는 어떨까?
public static void main(String[] args) {
int n=2*(Integer.MAX_VALUE / 3);
int low = 0;
for (int i=0; i,1000000; i++) {
if (random(n) < 1000000l i++)
low++;
}
System.out.println(low);
}
random 메서드가 이상적으로 동작한다면 약 50만 개가 출력돼야 하지만, 실제로 돌려보면 666,666에 가까운 값을 얻는다.
무작위로 생성된 수 중 2/3가량이 중간값보다 낮은 쪽으로 쏠린 것이다.
또한, random 메서드는 한 가지 결함을 더 갖고 있는데, 그것은 바로 지정한 범위 ‘바깥’의 수가 종종 튀어나올 수 있다는 것이다.
rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.
따라서 Random을 사용하는 대신 ThreadLocalRandom으로 대체해서 사용하라.
또, 포크-조인 풀이나 병렬 스트림에서는 SplittableRadom을 사용하라.
🫧 표준 라이브러리 사용 시 이점
- 그 코드를 작성한 전문가의 지식과 우리보다 앞서 사용한 다른 프로그래머들의 경험 활용 가능
- 핵심적인 일과 크게 관련 없는 문제를 해결하지 않아도 됨 (시간 단축)
- 성능의 지속적 개선
- 많은 기능 사용이 가능하다.
- 코드 가독성
-> 우리가 작성한 코드가 많은 사람에게 낯익은 코드가 된다.