아이템 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