이펙티브 자바, 쉽게 정리하기 - item 59. 라이브러리를 익히고 사용하라
java Random
라이브러리의 예제
public class Item59Test {
Random rnd = new Random();
@Test
public void randomTest() {
int n = 2 * (Integer.MAX_VALUE / 3); // 약 14억
int low = 0;
for (int i=0; i < 1_000_000; i++) {
if (randomNumber(n) < n / 2) { // 약 7억
low++;
}
}
System.out.println("low = " + low);
}
public int randomNumber(int n) {
return Math.abs(rnd.nextInt()) % n;
}
}
low
의 결과가 약 50만이 나와야 수가 고르게 분배되었다고 말할 수 있는데, 계속 시도해도 약 66만 근처가 나온다. 한쪽으로 약 2/3정도의 경우의 수가 쏠린다고 볼 수 있다.rnd.nextInt()
가 반환한 값을Math.abs()
를 통해 정수로 만드는데, 이 과정에서 몇가지 문제가 발생한다.- 이를테면
Integer.MIN_VALUE
에Math.abs()
를 적용하더라도 부호가 마이너스 그대로이다.
- 이를테면
randomNumber()
의 경우 다음과 같은 문제가 있다.n
이 그리 크지 않은 2의 제곱수라면, 얼마 지나지 않아 같은 수열이 반복된다.n
이 2의 제곱수가 아니라면, 몇몇 숫자가 계속 반복된다.
이와 같이 완전한 랜덤 숫자 생성기를 만드는 일은 쉽지 않은데, 이럴 때는 그냥 random.nextInt(int bound)
메서드를 이용하여 쉽게 구현할 수 있다. 알고리즘에 능통한 여러 전문가가 오랜 시간에 걸쳐 만들어낸 메서드이다.
손쉽게 랜덤 숫자 생성을 성공하는 코드
public class Item59Test {
Random rnd = new Random();
@Test
public void randomTest() {
int n = 2 * (Integer.MAX_VALUE / 3); // 약 14억
int low = 0;
for (int i=0; i < 1_000_000; i++) {
if (randomNumber2(n) < n / 2) { // 약 7억
low++;
}
}
System.out.println("low = " + low);
}
public int randomNumber2(int n) {
return rnd.nextInt(n);
}
}
- 별다른 노력 없이
rnd.nextInt(n)
메서드를 쓰는 것만으로 해결할 수 있다.
자바 7 이후 Random
- 자바 7 이후에는
ThreadLocalRandom
클래스를 사용하는 것이 더 좋다. - 포크-조인 풀이나 병렬 스트림에서는
SplittableRandom
클래스를 사용하는 것이 좋다.
표준 라이브러리를 쓰는 것의 이점
- 전문가의 지식과 경험을 활용할 수 있다.
- 핵심 비즈니스로직 외에 다른 것을 작성하는데 낭비하는 시간을 줄인다.
- 따로 노력하지 않아도 성능이 지속해서 개선된다.
- 패치를 거듭할수록 기능이 점점 많아진다.
- 많은 사람들에게 낯익은 코드가 되어 협업하기 좋다.
- 메이저 릴리즈에 주목할만한 수많은 기능이 라이브러리에 추가된다.
자바9 에서 추가된 transferTo()
의 예
@Test
public void urlTest() throws IOException {
try (InputStream in = new URL("https://dbpia.co.kr").openStream()) {
in.transferTo(System.out);
}
}
- 기존에 까다로운 코드로 구현해야 했던, URL 내용 가져오는 부분을 쉽게 구현할 수 있다.
핵심 정리
- 개발자들이 많이 쓸 것 같은 기능이 있다면, 개발하기보다 라이브러리를 찾아보자.
반응형
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바, 쉽게 정리하기 - item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2023.06.22 |
---|---|
이펙티브 자바, 쉽게 정리하기 - item 60. 정확한 답이 필요하다면 float 과 double 은 피하라 (0) | 2023.06.22 |
이펙티브 자바, 쉽게 정리하기 - item 58. 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2023.06.22 |
이펙티브 자바, 쉽게 정리하기 - item 57. 지역변수의 범위를 최소화하라 (0) | 2023.06.21 |
이펙티브 자바, 쉽게 정리하기 - item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2023.06.21 |