표준 라이브러리 사용 이유
무작위 정수 하나를 생성하는 예제 코드를 보자.
package com.java.effective.item59;
public class Random {
static java.util.Random rnd = new java.util.Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
}
위 코드는 흔하지만 문제가 많은 코드다.
1) n이 크지 않은 2의 제곱수라면 얼마 지나지않아 같은 수열이 반복된다.
2) n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
3) n 값이 크면 이 현상은 더 두드러진다.
다음 코드는 예시를 위해 특정 범위에서 무작위 수를 백만개 생성한 다음, 그 중 중간값보다 작은게 몇개인지 출력하는 코드다.
package com.java.effective.item59;
public class Random {
static java.util.Random rnd = new java.util.Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % 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);
}
}
random 메서드가 이상적으로 동작한다면 약 50만개가 출력돼야하지만, 실제로 돌려보면 666,666에 가까운 값이 출력된다. 무작위로 생성된 수 중에서 2/3 가량이 중간값보다 낮은 쪽으로 쏠린 것이다.
직접 만든 random 코드
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
해당 메서드가 반환한 값을 Math.abs를 이용하여 음수가 아닌 정수로 매핑하기 때문에 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다.
위 코드의 결함은 Random.nextInt(int)가 해결해준다. 이 라이브러리가 릴리스된 후에도 해당 코드는 버그가 보고된 적이 없다. 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
표준 라이브러리 사용의 이점
- 1) 자바 7부터는 Random 보다는 ThreadLocalRandom으로 대체하면 대부분 잘 작동하고 훨씬 빠르다.
- 2) 핵심적인 일과 크게 관련없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
- 3) 따로 노력하지 않아도 성능이 지속해서 개선된다.
- 4) 기능이 점점 많아진다.
- 5) 작성한 코드가 낯익은 코드가 된다. 다른 개발자들이 더 읽기 좋고, 유지보수 하기 좋고, 재활용하기 쉬운 코드가 된다.
라이브러리가 너무 방대하여 모든 API 문서를 공부하기에는 벅차겠지만, 자바 프로그래머라면 적어도 java.lang, java.util, java.io 와 그 하위 패키지들에는 익숙해져야한다. 다른 라이브러리들은 필요할때마다 익히면 된다.
컬렉션 프레임워크와 스트림 라이브러리는 알아두는게 좋다. java.util.concurrent의 동시성 기능도 마찬가지로 알아두면 큰 도움이 된다. 개발하면서 우선적으로 라이브러리를 사용하려고 시도해보자. 어떤 영역의 기능을 제공하는지 살펴보고, 여러분이 원하는 기능이 아니라 판단되면 대안을 사용하자. 자바 표준 라이브러리에서 원하는 기능을 찾지 못하면, 서드파티 라이브러리(구글의 Guava 등) 를 찾아보고, 적합한 서드파티 라이브러리도 찾지 못했다면 다른 선택이 없으니 직접 구현하자.
'Book > Effective Java' 카테고리의 다른 글
[교재 EffectiveJava] 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2021.12.03 |
---|---|
[교재 EffectiveJava] 아이템 60. 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2021.12.02 |
[교재 EffectiveJava] 아이템 58. 전통적인 for 문보다는 for-each문을 사용하라 (0) | 2021.11.30 |
[교재 EffectiveJava] 아이템 57. 지역변수의 범위를 최소화하라 (0) | 2021.11.29 |
[교재 EffectiveJava] 아이템 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2021.11.28 |