라이브러리를 익히고 사용하라
무작위 정수를 하나 생성하고 싶다고 해보자
- 값의 범위는 0부터 명시한 수 사이다.
- 아주 흔히 마주치는 문제로, 많은 프로그래머가 다음과 같은 짤막한 메서드를 만들곤 한다
- 괜찮은 듯 보여도 문제를 세 가지나 내포하고 있다. 첫 번째 N이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
- 두번째, n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
- n값이 크면 이 현상은 더 두드러진다.
- 아래 코드는 예시를 위해 신중히 선택한 범위에서 무작위 수를 백만개를 생성한 다음 그중 중간 값보다 작은게 몇개인지를 출력한다.
- random 메서드가 이상적으로 동작한다면 약 50만개가 출력되어야 하지만 실제로 돌려보면 666666에 가까운 값을 얻는다. 무작위로 생성된 수 중에서 2/3 가량이 중간값보다 낮은 값으로 쏠린 것이다.
- 세번째, 지정한 범위 바깥의 수가 종종 튀어 나올 수 있다.
- rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다.
- nextInt()가 Integer.MIN_VALUE를 반환하면 Math.abs도 Integer.MIN_VALUE를 반환하고, 나머지 연산자는 음수를 반환해버린다.
- 이렇게 되면 우리의 프로그램은 실패로 돌아가며 문제를 해결하고 싶어도 현상을 재현하기가 쉽지 않을것이다.
- 이 결함을 해결하려면 의사난수 생성기, 정수론, 2의 보수 계산 등에 조예가 깊어야 한다.
- 우리가 해결할 필요는 없다. 이미 잘 만들어져 있기 때문에
- Java7부터는 Random을 더이상 사용하지 않는게 좋다. ThreadLocalRandom으로 대체하면 대부분 잘 작동한다. 보다 고품질의 무작위 수를 생성할 뿐 아니라 속도도 더 빠르다.
- 한편 포크-조인 풀이나 병렬 스트림에는 SplittableRandom을 사용하라
- 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 우리보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
- 표준 라이브러리를 쓰는 두번째 이점은 핵심적인 일과 크게 관련없는 문제를 해결하느라 시간을 허비하지 않아도 된다는 점이다.
- 세번째 이점은 따로 노력하지 않아도 성능이 계속 개선된다는 점이다.
- 표준 라이브러리인 만큼 사용자가 많고 업계 표준 벤치마크를 사용해 성능을 확인하기 떄문에 더 나은 방법을 꾸준히 모색할 수 밖에 없다.
- 네번째 이점은 기능이 점점 많아진다는 것이다.
- 마지막 이점은 우리가 작성한 코드가 많은 사람에게 낯익은 코드가 된다는 것이다.
- 자연스럽게 다른 개발자들이 더 읽기 좋고, 유지보수하기 좋고, 재활용하기 쉬운 코드가 된다.
- 자바 프로그래머라면 적어도 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해져야 한다.(컬렉션, 스트림도 포함)
결론
- 바퀴를 다시 발명하지 말자. 아주 특별한 나만의 기능이 아니라면 누군가 이미 구현해놓았을 가능성이 크다.
- 그런 라이브러리가 있다면 쓰면 된다.
- 일밙거으로 라이브러리의 코드는 우리가 작성한 것보다 품질이 좋고 점차 개선될 것이다.
- 코드 품질에도 규모의 경제가 적용된다. 즉 라이브러리 코드는 개발자 각자가 작성하는 것보다 주목을 훨씬 많이 받으므로 품질이 그만큼 높아진다.