Effective Java를 읽고 정리한 정리본입니다.

📌 Item 59 : 라이브러리를 익히고 사용하라

🫧 라이브러리를 잘 모르고 사용하면 발생하는 일 - Ex, Random Library

무작위 정수 하나를 생성하고 싶다고 가정하자.

값의 범위는 0부터 명시한 수 사이다.

static Random rnd = new Random();

static int random(int n) {
  return Math.abs(rnd.nextInt()) % n;
}

이 코드에는 괜찮은 듯 보여도 문제를 세 가지나 가지고 있다.

  1. n이 그리 크지 않은 2의 제곱수라면 같은 수열이 반복될 것이다.
  2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
  3. 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을 사용하라.

🫧 표준 라이브러리 사용 시 이점

  1. 그 코드를 작성한 전문가의 지식과 우리보다 앞서 사용한 다른 프로그래머들의 경험 활용 가능
  2. 핵심적인 일과 크게 관련 없는 문제를 해결하지 않아도 됨 (시간 단축)
  3. 성능의 지속적 개선
  4. 많은 기능 사용이 가능하다.
  5. 코드 가독성
    -> 우리가 작성한 코드가 많은 사람에게 낯익은 코드가 된다.