[교재 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 등) 를 찾아보고, 적합한 서드파티 라이브러리도 찾지 못했다면 다른 선택이 없으니 직접 구현하자.

 

 

반응형

Designed by JB FACTORY