Home [Effective Java] Item59. 라이브러리를 익히고 사용하라!
Post
Cancel

[Effective Java] Item59. 라이브러리를 익히고 사용하라!

Item59. 라이브러리를 익히고 사용하라!

라이브러리 사용법을 익히지 못했을 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
    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);
    }
}
  • 많은 프로그래머들이 이와 같은 짤막한 메서드를 만들곤 한다.
  • 괜찮은 듯 싶으나 세 가지나 문제를 포함하고 있다.
    1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
    2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n의 값이 클수록 이 현상이 빈번해진다.
      • 이는 main 메서드 실행 결과를 통해 더 자세히 확인할 수 있는데, 우리는 main 메서드 실행을 통해 약 50만이라는 결과를 얻고 싶을 것이다. 하지만 출력된 값은 666,666에 가까운 값이다. 약 2/3 가량이 중간보다 낮은 쪽에 쏠린다는 것을 확인할 수 있다.
    3. 지정한 범위 ‘바깥’의 수가 종종 튀어나올 수 있다.
      • 메서드 내부에서 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.
  • 위와 같은 문제들에서 벗어나고 싶다면, 표준 라이브러리를 사용하자.
    • 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 나보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.

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

  • 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 나보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
  • 핵심적인 일과 크게 관련없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
  • 따로 노력하지 않아도 성능이 지속해서 개선된다.
    • 벤치마크를 통해 지속적인 성능 개량이 진행되기에 사용하다보면 성능이 나빠질 일은 없다.
  • 기능이 점점 많아진다.
    • 부족한 부분을 커뮤니티에서 지적받으면 이를 개선한 버전이 릴리즈된다.
  • 내가 작성한 코드가 많은 사람에게 낯익은 코드가 된다.
    • 다른 개발자들이 더 읽기 좋고, 유지보수하기 좋고, 재사용하기 좋은 코드가 된다.

라이브러리 사용의 실태

  • 실상은 많은 프로그래머들이 코드를 직접 구현해 사용하고 있다.
  • 그 이유는? 아마 라이브러리의 존재조차 모르고 있기 때문일 것이다.
  • 자바는 메이저 릴리즈마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.
    • 이를 웹페이지에 공시하고 있는데, 한 번쯤 읽어보자.
  • 라이브러리가 너무 많아 지칠 수도 있지만, 자바 프로그래머라면 적어도 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해지자.
    • Collection, Stream, java.util.concurrent의 동시성 기능도 알아두면 좋다.

라이브러리 기능이 충분치 못할 때

  • 때론 라이브러리가 필요한 기능을 충분히 뒷받침 해주지 못할 수 있다. 특히 전문적인 작업일수록 더 자주 이런 일을 겪을 것이다.
  • 우선 라이브러리 사용을 시도해보고, 그래도 안되면 대안으로 고품질의 서드파티 라이브러리를 사용해보자.
  • 서드파티 라이브러리도 찾지 못했으면 직접 구현하자.

핵심 정리

  • 바퀴를 다시 발명하지 말자. (이미 있는데 왜 또 구현하고 있냐?😅)
  • 아주 특별한 기능이 아닌 이상 누군가 라이브러리 형태로 구현해놨을 것이고, 찾았으면 사용하자. 존재 여부를 모르겠다면 일단 찾아보자.
  • 일반적으로 라이브러리의 코드는 내가 직접 작성한 코드보다 품질이 좋고, 향후 성능의 개선 여지도 있다.
    • 코드의 품질에도 경제가 적용되니, 주목받는 라이브러리 코드일수록 코드 품질도 그만큼 더 높아질 수밖에 없다.
This post is licensed under younghwani by the author.

[Effective Java] Item58. 전통적인 for 문보다는 for-each 문을 사용하라!

[Effective Java] Item60. 정확한 답이 필요하다면 float과 double은 피하라!

Comments powered by Disqus.