아이템 59. 라이브러리를 익히고 사용하라. - ksw6169/effective-java GitHub Wiki

예제 - Random 클래스를 활용한 난수 발생기

다음은 난수를 100만개 생성한 후 난수의 분포도를 체크하는 예제다.

static Random rnd = new Random();

static int random(int n) {
    return Math.abs(rnd.nextInt()) % 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) < n/2)
            low++;
    System.out.println(low);
}

이 코드는 문제점을 3가지 내포하고 있다.

  • n이 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
  • n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
  • 지정한 범위 바깥의 수가 종종 튀어나올 수 있다. (음수가 나올 수 있음)

이러한 문제점을 해결하려면 난수를 발생시키는 표준 라이브러리를 사용해야 한다.

표준 라이브러리를 사용하면 얻을 수 있는 이점

  • 그 코드를 작성한 전문가의 지식과 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
  • 핵심적인 애플리케이션 기능 개발에 더 집중할 수 있다.
  • 노력하지 않아도 성능이 지속적으로 개선된다.
  • 라이브러리의 기능이 지속적으로 추가된다.
  • 표준 라이브러리를 사용한 코드는 보편적인 코드이므로 다른 개발자들의 유지보수에 용이하다.

자바 프로그래머라면 자주 사용되는 표준 라이브러리를 익혀두자.

  • 메이저 릴리즈마다 주목할 만한 수많은 기능이 추가되므로 제공되는 기능은 직접 구현하지 말자.
  • 자바 프로그래머라면 java.lang, java.util, java.io 와 그 하위 패키지들에 익숙해져야 한다.
  • 또한 컬렉션 프레임워크와 스트림 라이브러리, java.util.concurrent 의 동시성 기능도 알아두면 큰 도움이 된다. java.util.concurrent 패키지는 멀티 스레드 프로그래밍 작업을 단순화해주는 고수준의 편의 기능은 물론, 능숙한 개발자가 자신만의 고수준 개념을 직접 구현할 수 있도록 도와주는 저수준 요소들을 제공한다.

핵심 정리

  • 바퀴를 다시 발명하지 말자. 필요한 기능을 누군가 이미 라이브러리로 구현해놓았을 가능성이 크다.
  • 일반적으로 라이브러리의 코드는 직접 작성한 것보다 품질이 좋고, 점차 개선될 가능성이 크다.

참고 자료

  • Effective Java 3/E