DEV ℧ Developer Diary

[EffectiveJava] item59 - 라이브러리를 익히고 사용하라.

무작위 정수를 하나 생성하고 싶다고 해보자. 많은 프로그래머가 다음과 같은 짤막한 메서드를 만들곤 한다.

static Random rnd = new Random();

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

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

  • 첫 번째, n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
  • 두 번째, n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
  • 세 번째, 지정한 범위 ‘바깥’의 수가 종종 튀어나올 수 있다. rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.

라이브러리의 이점

이 결함을 해결하려면 의사난수 생성기, 정수론, 2의 보수 계산 등에 조예가 깊어야 한다. 하지만 직접 해결 할 일은 없다. Random.nextInt(int)가 이미 해결해 놨다.

알고리즘에 능통한 개발자가 설계와 구현과 검증에 시간을 들여 개발했고, 이 분야의 여러 전문가가 잘 동작함을 검증해 줬다. 20년동안 버그가 보고된 적이 없었으며, 발생하더라도 다음 릴리즈에 수정될 것이다.

표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.

Random

자바 7부터는 Random을 더 사용하지 않는 것이 좋다. ThreadLocalRandom으로 대체하면 대부분 잘 작동한다. 더 고품질의 무작위수를 생성하고 속도도 더 빠르다.
한편 포크-조인 풀이나 병렬 스트림에서는 SplittableRandom을 사용하라.

라이브러리의 두번째 이점

라이브러리의 두 번째 이점은 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다는 것이다.

라이브러리의 세번째 이점

세 번째 이점은 노력하지 않아도 성능이 지속해서 개선된다는 점이다. 자바 플랫폼 라이브러리의 많은 부분이 수 년에 걸쳐 지속해서 다시 작성되며, 때론 성능이 극적으로 개선되기도 한다.

라이브러리의 네번째 이점

네 번째 이점은 기능이 점점 많아진다는 것이다. 라이브러리에 부족한 부분이 있다면, 개발자 커뮤니티에서 이야기가 나오고 논의된 후 다음 릴리스에 해당 기능이 추가되곤 한다.

라이브러리의 마지막 이점

마지막 이점은 여러분이 작성한 코드가 많은 사람들에게 낯익은 코드가 된다는 점이다. 자연스럽게 다른 개발자들이 더 읽기 좋고, 유지보수 및 재화용 하기 쉬운 코드가 된다.

라이브러리의 활용

실상은 많은 프로그래머가 직접 기능을 구현해 쓰고 있다. 아마도 라이브러리에 그런 기능이 있는지 모르기 때문일것이다. 메이저 릴리스 마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.

자바는 메이저 릴리스 마다 새로운 기능을 설명하는 웹페이지를 공시하는데 한번쯤 읽어볼만 하다.

예시를 한번 들어보도록 하자. 지정한 URL의 내용을 가져오는 명령줄 애플리케이션을 작성해 보겠다.(리눅스의 curl과 비슷하다.)

예전에는 작성하기 까다로운 기능이었지만, 자바 9에서 InputStream에 추가된 transferTo 메서드를 사용하면 쉽게 구현할 수 있다.

public static void main(String[] atgs) threws IOException {
    try (InputStream in = new URL(args[0]).openStream()) {
        in.transferTo(System.out);
    }
}

주요 라이브러리

라이브러리가 너무 방대하지만, 자바 프로그래머라면 적어도 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해져야 한다. 다른 라이브러리는 필요할 때마다 익히기 바란다.

또 언급해둘 만한 라이브러리는 몇개 있다. 컬렉션 프레임워크와 스트림 라이브러리다. java.util.concurrent의 동시설 기능도 마찬가지로 알아두면 큰 도움이 된다.

라이브러리가 미제공하는 기능

때때로 라이브러리가 여러분에게 필요한 기능을 충분히 제공하지 못할 수 있다. 더 전문적인 기능을 요구할수록 이런 일이 더 자주 생길것이다.

자바 표준 라이브러리에서 원하는 기능을 찾지 못하면, 그다음 선택지는 고품질의 서드파티 라이브러리가 될 것이다. 구글의 멋진 구아바 라이브러리가 대표적이다. 적합한 서드파티 라이브러리도 찾지 못했다면, 다른선택이 없으니 직접 구현하자.