티스토리 뷰
반응형
static Random rnd = new 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 < 1_000_000; ++i)
if (random(n) < n/2)
low++;
System.out.println(low);
}
위 코드는 무작위 정수를 하나를 생성하는 코드인데 문제점이 많다.
- n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
- n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
- 위 예제에서 난수라면 평균적으로 low의 값이 50만으로 나와야하지만, 66만에 가깝게 나옴
- 지정한 범위 바깥의 수가 튀어나올 수 있는 조건이 있다.
- rnd.nextInt()가 반환한 값을 Math.abs로 음수가 아닌 정수로 매핑하기 때문
- Integer.MIN_VALUE = (-2_147_483_648) → Math.abs() = +2_147_483_648. 그러나 Integer.MAX_VALUE = 2_147_483_647 이므로 범위에서 넘어간다.
이러한 문제점들을 직접 해결할 필요는 없다.
Random.nextInt(int)가 이미 해결해놓았다.
표준 라이브러리의 장점
- 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 다른 프로그래머들의 경험을 활용할 수 있다. 자바7부터는 Random을 사용하지말고 ThreadLocalRandom 으로 대체하자. 만약 포크-조인 풀, 병렬 스트림이라면 SplittableRandom 을 사용하자.
- 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간 허비 안해도됨
- 따로 노력하지 않아도 성능이 지속해서 개선이됨
- 기능이 점점 많아짐
- 표준 라이브러리에 기능이 많음에도 그런 기능이 있는지 몰라서 많은 프로그래머가 직접 구현해서 쓰고 있음 → 메이저 릴리스마다 주목할만한 수많은 기능이 추가되니 읽어볼만함.
- 표준 라이브러리를 사용하면 내가 작성한 코드가 많은 사람에게 낯익은 코드가 된다.
자바 프로그래머가 익혀야할 필수 표준 라이브러리들
- java.lang
- java.util
- java.io
- Collection framework
- Stream [아이템 45~48]
- java.util.concurrent → 알아두면 도움이 됨
라이브러리를 최대한 사용하려 해보고, 원하는 기능을 찾지 못했다면 고품질의 서드파티 라이브러리를 찾아보자.
그것도 못찾았다면 직접 구현하자.
결론
아주 특별한 나만의 기능이 아니면 누군가 라이브러리로 구현해놓았을 가능성이 크니 그걸 쓰자.
있는지 잘모르겠으면 찾아보라.
일반적으로 라이브러리 코드는 직접 작성한 것보다 고품질이고 개선될 가능성이 크다.
반응형
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] 61.박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2022.04.08 |
---|---|
[Effective Java] 60.정확한 답이 필요하다면 float와 double은 피하라 (0) | 2022.04.06 |
[Effective Java] 58.전통적인 for 문보다는 for-each문을 사용하라 (0) | 2022.04.06 |
[Effective Java] 57.지역변수의 범위를 최소화하라 (0) | 2022.04.06 |
[Effective Java] 56.공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2022.04.06 |
댓글