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

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

728x90

표준 라이브러리 사용 이유

무작위 정수 하나를 생성하는 예제 코드를 보자.

package com.java.effective.item59; public class Random { static java.util.Random rnd = new java.util.Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } }

위 코드는 흔하지만 문제가 많은 코드다.

1) n이 크지 않은 2의 제곱수라면 얼마 지나지않아 같은 수열이 반복된다.

2) n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.

3) n 값이 크면 이 현상은 더 두드러진다.

다음 코드는 예시를 위해 특정 범위에서 무작위 수를 백만개 생성한 다음, 그 중 중간값보다 작은게 몇개인지 출력하는 코드다.

package com.java.effective.item59; public class Random { static java.util.Random rnd = new java.util.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); } }

random 메서드가 이상적으로 동작한다면 약 50만개가 출력돼야하지만, 실제로 돌려보면 666,666에 가까운 값이 출력된다. 무작위로 생성된 수 중에서 2/3 가량이 중간값보다 낮은 쪽으로 쏠린 것이다.

직접 만든 random 코드

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

해당 메서드가 반환한 값을 Math.abs를 이용하여 음수가 아닌 정수로 매핑하기 때문에 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다.

위 코드의 결함은 Random.nextInt(int)가 해결해준다. 이 라이브러리가 릴리스된 후에도 해당 코드는 버그가 보고된 적이 없다. 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.

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

1) 자바 7부터는 Random 보다는 ThreadLocalRandom으로 대체하면 대부분 잘 작동하고 훨씬 빠르다.

2) 핵심적인 일과 크게 관련없는 문제를 해결하느라 시간을 허비하지 않아도 된다.

3) 따로 노력하지 않아도 성능이 지속해서 개선된다.

4) 기능이 점점 많아진다.

5) 작성한 코드가 낯익은 코드가 된다. 다른 개발자들이 더 읽기 좋고, 유지보수 하기 좋고, 재활용하기 쉬운 코드가 된다.

라이브러리가 너무 방대하여 모든 API 문서를 공부하기에는 벅차겠지만, 자바 프로그래머라면 적어도 java.lang, java.util, java.io 와 그 하위 패키지들에는 익숙해져야한다. 다른 라이브러리들은 필요할때마다 익히면 된다.

컬렉션 프레임워크와 스트림 라이브러리는 알아두는게 좋다. java.util.concurrent의 동시성 기능도 마찬가지로 알아두면 큰 도움이 된다. 개발하면서 우선적으로 라이브러리를 사용하려고 시도해보자. 어떤 영역의 기능을 제공하는지 살펴보고, 여러분이 원하는 기능이 아니라 판단되면 대안을 사용하자. 자바 표준 라이브러리에서 원하는 기능을 찾지 못하면, 서드파티 라이브러리(구글의 Guava 등) 를 찾아보고, 적합한 서드파티 라이브러리도 찾지 못했다면 다른 선택이 없으니 직접 구현하자.

from http://devfunny.tistory.com/635 by ccl(A) rewrite - 2021-12-01 12:01:22