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을 사용하자.
라이브러리 사용의 장점
- 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 우리보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
- 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
- 따로 노력하지 않아도 성능이 지속해서 개선된다.
- 기능이 점점 많아진다.
- 우리가 작성한 코드가 많은 사람에게 낯익은 코드가 된다. 다른 개발자들이 더 읽기 좋고, 유지보수하기 좋고, 재활용하기 쉬운 코드가 된다.
왜 많은 프로그래머가 이런 라이브러리를 놔두고 직접 구현해 쓸까
아마 라이브러리에 그런 기능이 있는지 모르기 때문이다.
메이저 릴리스마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.
자바 프로그래머라면 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해져야 한다.
컬렉션 프레임워크와 스트림 라이브러리, java.util.concurrent의 동시성 기능 등을 익혀두자.
결론
- 아주 특별한 나만의 기능이 아니라면 누군가 이미 라이브러리 형태로 구현해 놓았을 가능성이 크다.
- 일반적으로 라이브러리의 코드는 우리가 직접 작성한 것보다 품질이 좋고, 점차 개선될 가능성이 크다.