본문 바로가기

독서찰기(讀書札記)/이펙티브 자바

[아이템 59] 라이브러리를 익히고 사용하라

[Why]

"바퀴를 다시 발명하지 마라."

static Random rnd = new Random();

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

괜찮은 듯 보여도 문제를 세 가지나 내포하고 있다.

  • 첫 번째, n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
  • 두 번째, n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n값이 크면 이 현상은 더 두드러진다.
  • 세 번째, 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다.
    • rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.
    • nextInt()가 Integer.MIN_VALUE를 반환하면 Math.abs도 Integer.MIN_VALUE를 반환하고, 나머지 연산자(%)는 음수를 반환해버린다(n이 2의 제곱수가 아닐 때의 시나리오다).

이 결함을 해결하려면 의사난수 생성기, 정수론, 2의 보수 계산 등에 조예가 깊어야 한다.

 

다행히 Random.nextInt(int)가 이미 해결해놨다.

  • 이 메서드의 자세한 동작 방식은 몰라도 된다.
    자바 7부터는 Random 대신 ThreadLocalRandom으로 대체하여 사용하자.
  • 알고리즘에 능통한 개발자가 설계와 구현과 검증에 시간을 들여 개발했고, 이 분야의 여러 전문가가 잘 동작함을 검증해줬다.

표준 라이브러리 사용의 이점

  • 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
  • 핵심적인 일과 크게 관련이 없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
  • 따로 노력하지 않아도 성능이 지속해서 개선된다.
  • 기능이 점점 많아진다.
  • 우리가 작성한 코드가 많은 사람에게 낯익은 코드가 된다.

 

[How]

이상의 이점들에도 불구하고, 많은 프로그래머가 라이브러리에 그런 기능이 있는 줄 모르고 직접 구현해서 쓰고 있다.

  • 메이저 릴리스마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.
  • 자바는 메이저 릴리스마다 새로운 기능을 설명하는 웹페이지를 공시하는데, 한번쯤 읽어볼 만하다.

자바 프로그래머라면 적어도 몇몇 라이브러리와 그 하위 패키지들에는 익숙해져야 한다.

  • java.lang
  • java.util
  • java.io
  • 컬렉션 프레임워크
  • 스트림 라이브러리
  • java.util.concurrent

어떤 라이브러리든 제공하는 기능은 유한하므로 항상 빈 구멍이 있기 마련이다.

  • 자바 표준 라이브러리에서 원하는 기능을 찾지 못하면, 그 다음 선택지는 고품질의 서드파티 라이브러리가 될 것이다.