Java/Effective Java

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

안도일 2023. 7. 23. 16:58

 

Random

 

무작위 수를 생성하는 코드

 

 

 

  • 책의 글쓴이가 신중히 선택한 범위에서 무작위 수를 100만 개 생성한 다음, 그중 중간 값보다 작은 게 몇 개인지 출력한다.
  • random 메서드가 이상적으로 동작한다면 약 50만개가 출력돼야 하지만, 실제로 돌려보면 666,666에 가까운 값을 얻는다.
  • 무작위 생성 수 중 2/3가 중간값보다 낮은 쪽으로 쏠린것이다.

 

 

위 코드는 문제를 세 가지나 내포하고 있다.

 

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

2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n 값이 크면 이 현상은 더 두드러진다.

3. 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다.

  • rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.
  • nextInt()가 Integer.MIN_VALUE를 반환하면 Math.abs는 정수로 반환해 매핑하지 않고 그대로  Integer.MIN_VALUE를 반환하고, 나머지 연산자(%)는 음수를 반환해 버린다.
  • 이러한 문제는 Random.nextInt(int)가 해결했다.

 

 

자바 7부터는 Random 보다 ThreadLocalRandom으로 대체하자.

Random보다 고품질의 무직위 수를 생성하고, 속도도 더 빠르다.

포크-조인 풀이나 병렬 스트림에서는 SplittableRandom을 사용하자.

 

 

라이브러리 사용의 장점

 

  1. 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 우리보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
  2. 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
  3. 따로 노력하지 않아도 성능이 지속해서 개선된다.
  4. 기능이 점점 많아진다.
  5. 우리가 작성한 코드가 많은 사람에게 낯익은 코드가 된다. 다른 개발자들이 더 읽기 좋고, 유지보수하기 좋고, 재활용하기 쉬운 코드가 된다.

왜 많은 프로그래머가 이런 라이브러리를 놔두고 직접 구현해 쓸까

 

아마 라이브러리에 그런 기능이 있는지 모르기 때문이다.

메이저 릴리스마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.

 

자바 프로그래머라면 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해져야 한다.

 

컬렉션 프레임워크와 스트림 라이브러리, java.util.concurrent의 동시성 기능 등을 익혀두자.

 

 

 

결론

 

  • 아주 특별한 나만의 기능이 아니라면 누군가 이미 라이브러리 형태로 구현해 놓았을 가능성이 크다.
  • 일반적으로 라이브러리의 코드는 우리가 직접 작성한 것보다 품질이 좋고, 점차 개선될 가능성이 크다.