Skip to content

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

@heon118

Description

@heon118

Chapter : 9. 일반적인 프로그래밍 원칙

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

Assignee : heon118


🍑 서론

흔하지만 문제가 심각한 코드

static Random rnd = new Random();

static int random(int n) {
    return Math.abs(rnd.nextInt()) % n;
}
  1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
  2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. 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);
}
  • 50만 개가 아닌 666,666에 가까운 값을 얻는다.
  1. 지정한 범위 '바깥'의 수가 종종 나올 수 있다.
  • rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문

이런 문제들을 Random.nextInt(int)에서 해결해놨다. 따라서 표준 라이브러리를 사용하면 된다.

🍑 본론

표준 라이브러리를 사용했을 때의 이점

첫 번째, 코드를 작성한 전문가의 지식과 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.

  • Java 7부터는 Random보다는 ThreadLocalRandom을 사용하면 대부분 잘 작동하며 더 고품질의 무작위 수를 생성할 뿐만 아니라 속도도 더 빠르다.
  • 포크-조인 풀이나 병렬 스트림에서는 SplittableRandom을 사용해라.

포크-조인 풀 : 큰 업무를 작은 업무로 나누어 배분해서, 일을 한 후 일을 취합하는 형태

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

  • 개발자는 하부 공사를 하기보다는 애플리케이션 기능 개발에 집중하고 싶어 한다.

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

  • 사용자가 많고, 업계 표준 벤치마크를 사용해 성능을 확인하기 때문에 자바 플랫폼 라이브러리의 많은 부분이 지속해서 재작성되며, 성능이 극적으로 개선되기도 한다.

네 번째, 기능이 점점 많아진다.

  • 라이브러리에 부족한 부분이 있다면 개발자 커뮤니티에서 이야기가 나오고 논의 후 다음 릴리스에 해당 기능이 추가되곤 한다.

마지막, 작성한 코드가 많은 사람에게 낯익은 코드가 된다.

  • 자연스럽게 다른 개발자들이 더 읽기 좋고, 유지보수하기 좋고, 재활용하기 쉬운 코드가 된다.

사람들은 라이브러리에 원하는 기능이 있는지 모르고 구현해서 사용한다.

  • 메이저 릴리스마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.
  • Java 프로그래머라면 java.lang, java.util, java.io와 그 하위 패키지들은 읽어보고 익숙해져야 한다.
  • 컬렉션 프레임워크와 스트림 라이브러리(item 45 ~ 48), java.util.concurrent의 동시성 기능도 알아두면 큰 도움이 된다.

java.util.concurrent 패키지는 멀티스레드 프로그래밍 작업을 단순화해주는 고수준의 편의 기능은 물론, 능숙한 개발자가 자신만의 고수준 개념을 직접 구현할 수 있도록 도와주는 저수준 요소들을 제공한다. 고수준 개념은 item 80, 81에서 다룬다.

🍑 결론

라이브러리가 필요한 기능을 충분히 제공하지 못할 수 있다.

우선은 라이브러리를 사용하려 시도해보고 원하는 기능이 아니라 판단되면 대안을 사용하자.

Referenced by

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions