독서찰기(讀書札記)/이펙티브 자바
[아이템 59] 라이브러리를 익히고 사용하라
NoodleMan
2022. 3. 25. 00:24
[Why]
"바퀴를 다시 발명하지 마라."
static Random rnd = new Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
괜찮은 듯 보여도 문제를 세 가지나 내포하고 있다.
- 첫 번째, n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
- 두 번째, n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n값이 크면 이 현상은 더 두드러진다.
- 세 번째, 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다.
- rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.
- nextInt()가 Integer.MIN_VALUE를 반환하면 Math.abs도 Integer.MIN_VALUE를 반환하고, 나머지 연산자(%)는 음수를 반환해버린다(n이 2의 제곱수가 아닐 때의 시나리오다).
이 결함을 해결하려면 의사난수 생성기, 정수론, 2의 보수 계산 등에 조예가 깊어야 한다.
다행히 Random.nextInt(int)가 이미 해결해놨다.
- 이 메서드의 자세한 동작 방식은 몰라도 된다.
자바 7부터는 Random 대신 ThreadLocalRandom으로 대체하여 사용하자. - 알고리즘에 능통한 개발자가 설계와 구현과 검증에 시간을 들여 개발했고, 이 분야의 여러 전문가가 잘 동작함을 검증해줬다.
표준 라이브러리 사용의 이점
- 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
- 핵심적인 일과 크게 관련이 없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
- 따로 노력하지 않아도 성능이 지속해서 개선된다.
- 기능이 점점 많아진다.
- 우리가 작성한 코드가 많은 사람에게 낯익은 코드가 된다.
[How]
이상의 이점들에도 불구하고, 많은 프로그래머가 라이브러리에 그런 기능이 있는 줄 모르고 직접 구현해서 쓰고 있다.
- 메이저 릴리스마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.
- 자바는 메이저 릴리스마다 새로운 기능을 설명하는 웹페이지를 공시하는데, 한번쯤 읽어볼 만하다.
자바 프로그래머라면 적어도 몇몇 라이브러리와 그 하위 패키지들에는 익숙해져야 한다.
- java.lang
- java.util
- java.io
- 컬렉션 프레임워크
- 스트림 라이브러리
- java.util.concurrent
어떤 라이브러리든 제공하는 기능은 유한하므로 항상 빈 구멍이 있기 마련이다.
- 자바 표준 라이브러리에서 원하는 기능을 찾지 못하면, 그 다음 선택지는 고품질의 서드파티 라이브러리가 될 것이다.