Skip to content

[아이템 59] 라이브러리를 익히고 사용하라 #33

@DongLee99

Description

@DongLee99

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

static Random rnd = new Random();

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

다음 코드의 문제점을 바로 발견할 수 있는가? 나는 그러지 못했다. 위 코드는 문제점을 품고 있다.

  • n이 크지 않는 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
  • n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
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);
}

위 코드는 Effective Java의 필자가 작성한 코드이다. 설계대로라면 50만개의 값이 출력되어야 하지만 실제로는 666,666개에 가까운 값을 얻는다.
이는 Random메서드의 세 번째 결함으로 지정한 범위 '바깥'의 수가 종종 튀어나온다. 이는 rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.

하지만 이런 문제를 우리가 직접 해결할 필요는 없다. Random.nextInt(int)가 이미 해결해놨기 때문이다. 이처럼 표준 라이브러리를 사용할 때의 장점이 나온다.

표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.

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

  • 프로그래머들은 하부 공사보다는 애플리케이션 기능개발에 초점을 맞추고 싶어한다.

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

기능이 점점 많아진다.

작성한 코드가 사람들에게 낯익은 코드가 된다.

  • 우리는 늘 협업을 해야하기 때문에 가독성이 높은 코드를 작성해야한다. 이에 표준 라이브러리를 사용시 여러 개발자가 이미 겪어본 코드이기 때문에 자연스럽게 가독성이 높아지고 유지보수에도 능하다.

라이브러리가 너무 방대하기 때문에 모든 API 문서를 공부하기는 벅차지만 자바 프로그래머라면 적어도 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해지자.

때때로 라이브러리가 필요한 기능을 충분히 제공하지 못할 수 있다. 그래도 우선은 라이브러리를 사용하려 해보자.

  • 라이브러리를 사용
  • 만약 원하는 기능이 없거나 아니라 판단시에 고품질 서브파티 라이브러리를 찾아보자
  • 그래도 없다면 직접 구현

정리

아주 특별한 나만의 기능이 아니라면 누군가 이미 라이브러리 형태로 구현해놓았을 것이다. 찾아쓰자. 대부분은 직접 작성한 코드보다 성능, 품질 모두 뛰어나다. 또한 점차 개선될 가능성도 있다.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions