Skip to content

Latest commit

 

History

History
163 lines (99 loc) · 5.8 KB

59_라이브러리를_익히고_사용하라_김보배.md

File metadata and controls

163 lines (99 loc) · 5.8 KB

아이템 59. 라이브러리를 익히고 사용하라.

결론

바퀴를 다시 발명하지 말자

라이브러리에 미숙할 때

책에서 나온 무작위 정수 생성 예제

public class TestMain {
    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()Integer.MIN_VALUE를 반환하면 결과적으로 음수가 반환될 수 있다.

      # 우리가 예상한 것
      - `Integer.MIN_VALUE` (-2_147_483_648) → `Math.abs()` → +2_147_483_648
      
      # 하지만
      `Integer.MAX_VALUE` = 2_147_483_647
      
      # 
      abs를 통해 변환한 값이 `Integer.MAX_VALUE`보다 크다
      => +2_147_483_648 = -2_147_483_648
      => 결국, abs 결과가 음수 -2_147_483_648가 반환된다.
  • 왜 이러한 문제가 있을까? 수학적인 이야기! 참고

    Effective Java Item 47: Know and use your libraries - Flawed random integer method example

    • 음의 정수, 부호비트, 보수 관련해 찾아보시길 !

위 예제와 문제가 말하고자 하는 것

위 결함을 해결하기 위해선 난수 생성기, 정수론, 2의 보수 계산 등을 알아야 할 것

→ 이걸 일반 프로그래머가 신경쓰며 개발할 수 있을까?

→ 이걸 해결한 Random.nextInt(integer)를 사용하자.

→ 근데 사실 Random 쓰지말라고 한다. → 뒤에서 확인

위 과정처럼 생각을 하려면 ? → 라이브러리에 대해 이해하고 익히고 사용하자.


표준 라이브러리 사용을 통해 얻을 수 있는 것


그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머의 경험을 활용할 수 있다

자바 7부터는 Random 사용하지말고, ThreadLocalRandom으로 대체하자.

만약 포크-조인 풀, 병렬 스트림인 경우라면, SplittableRandom을 사용하자.

  • 고품질의 무작위 수를 반환하며 속도도 더 빠르다.

image


random thread


Random → LCG 알고리즘 → 결과의 패턴 존재 → 보안적인 난수에는 사용해서는 안된다.

다른 난수 생성 알고리즘을 사용하고 싶다면 java.security.SecureRandom 사용!

Java Random - ThreadLocalRandom, SplittableRandom, SecureRandom


핵심적인 일과 크게 관련없는 문제를 해결하느라 시간을 허비하지 않아도 된다

애플리케이션 기능 개발에 집중할 수 있다.


따로 노력하지 않아도 성능이 지속해서 개선된다

사용자가 많고, 업계 표준 벤치마크를 사용해 성ㄴ


기능이 점점 많아진다.

부족한 부분에 대해서 개발자 커뮤니티 등에서 논의가 계속되고, 이를 보완해 릴리즈에 기능이 추가되기도 한다.


표준 라이브러리를 활용한 코드는 많은 사람에게 낯익은 코드가 된다

읽기 좋고, 유지보수하기 좋고, 재활용하기 좋다


하지만 !

이러한 장점들이 있음에도 많은 프로그래머들이 직접 구현해 사용하고 있다. 왜 그럴까?

아마도 라이브러리에 그러한 기능이 있는지 모르기 때문

→ 메이저 릴리즈마다 주목할 만한 수많은 기능이 라이브러리에 추가된다. Java는 메이저 릴리즈 때마다 새로운 기능을 설명하는 웹페이지를 공시

Consolidated JDK 8 Release Notes

Consolidated JDK 11 Release Notes


이건 필수야 !

표준 라이브러리

  • java.lang
  • java.util
  • java.io
  • Collection framework
  • Stream
  • java.util.concurrent

고품질 3rd party 라이브러리

The Guava library: What are its most useful and/or hidden features?


An Introduction to Apache Commons Lang 3 | Baeldung

Apache Commons Lang StringUtils - DZone Java

https://www.baeldung.com/apache-commons-collections-vs-guava