Item 59. 라이브러리를 익히고 사용하라

무작위 정수 만들기

무작위 정수를 하나 생성한다고 해보자

1
2
3
4
static Random rnd = new Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}

괜찮아 보이지만 3가지의 문제를 내포하고 있다.

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

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

1
2
3
4
5
6
7
8
9
10
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 가량이 중간값보다 낮은 쪽으로 쏠린 것이다.

  • 지정한 범위 바깥의 수가 종종 튀어나올 수 있다. rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.

표준 라이브러리를 사용하면 다른 프로그래머들의 경험을 활용할 수 있다.

  • 메서드의 동작 방식은 몰라도 알고리즘에 능통한 개발자나, 여러 분야의 전문가가 설계와 구현에 시간을 들여 개발한 것이다.
  • 버그가 발생되더라도 다음 릴리스에 수정 보완 개선이 될 수 있다.
  • 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
  • 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 되고 어플리케이션 기능 개발에 집중할 수 있다.
  • 따로 노력하지 않아도 릴리즈가 나올 때 마다 성능이 지속해서 개선된다.
  • 기능이 점점 많아진다. 개발자 커뮤니티에서 나온 이야기를 바탕으로 논의 후 다음 릴리즈에 기능이 추가되곤 한다.
  • 라이브러리를 사용하면 많은 사람들에게 낯익은 코드가 된다. 다른 개발자들이 유지보수 하기 쉬워지고 재사용성이 높아진다.

메이저 버전 릴리즈 마다 수많은 기능이 추가된다.

  • 자바는 메이저 릴리즈마다 새로운 기능을 설명하는 웹페이지를 공시한다.
  • 한 번쯤은 읽어볼만 하다
  • 너무 많아서 읽기 힘든 경우에는 java.lang, java.util, java.io와 하위 패키지들에는 익숙해져야 한다.
  • 컬렉션 프레임워크나 concurrent 패키지는 알아두면 도움이 도니다.

예시 - transferTo 메서드를 이용해 URL 내용 가져오기

1
2
3
4
5
public static void main(String[] args) throws IOException {
try {InputStream in = new URL(args[0]).openStream()) {
in.transferTo(System.out);
}
}

  • java 9 버전 부터 URL정보를 쉽게 출력해 주는 transferTo 메서드를 제공한다.

정리

  • 라이브러리가 전문적인 기능을 제공해 주지 못할수도 있지만, 라이브러리를 일단 사용해보자
  • 특별한 기능이 아니라면 누군가 라이브러리로 만들어 두었을 가능성이 높다.
    일단 라이브러리가 있는지 찾아보자
  • 일반적으로 라이브러리의 코드는 개발자가 작성한 것보다 품질이 좋고 개선의 여지가 있다.
  • 라이브러리 코드는 주목을 많이 받고 개발자 커뮤니티에서 문제점이 많이 거론되므로 코드 품질이 점차 좋아진다.

참고

  • Effective Java 3rd Edition - Item 59. 라이브러리를 익히고 사용하라