From 4c8b9047cb7014a24e5a0dc5cc25a792b2388922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8F=84=EB=AA=A8?= Date: Sun, 3 Sep 2023 11:49:07 +0900 Subject: [PATCH] =?UTF-8?q?[Item59]:=20=EB=9D=BC=EC=9D=B4=EB=B8=8C?= =?UTF-8?q?=EB=9F=AC=EB=A6=AC=EB=A5=BC=20=EC=9D=B5=ED=9E=88=EA=B3=A0=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=9D=BC=20(#140)(=EB=8F=84?= =?UTF-8?q?=EB=AA=A8)=20(#149)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\354\232\251\355\225\230\353\235\274.md" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 "Ch09/item59/\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\353\245\274_\354\235\265\355\236\210\352\263\240_\354\202\254\354\232\251\355\225\230\353\235\274.md" diff --git "a/Ch09/item59/\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\353\245\274_\354\235\265\355\236\210\352\263\240_\354\202\254\354\232\251\355\225\230\353\235\274.md" "b/Ch09/item59/\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\353\245\274_\354\235\265\355\236\210\352\263\240_\354\202\254\354\232\251\355\225\230\353\235\274.md" new file mode 100644 index 0000000..dc929f6 --- /dev/null +++ "b/Ch09/item59/\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\353\245\274_\354\235\265\355\236\210\352\263\240_\354\202\254\354\232\251\355\225\230\353\235\274.md" @@ -0,0 +1,61 @@ +# item59. 라이브러리를 익히고 사용하라 + +### 무작위 정수 만들기 +무작위 정수를 하나 생성한다고 해보자 +```java +static Random rnd = new Random(); +static int random(int n) { + return Math.abs(rnd.nextInt()) % n; +} +``` +괜찮아 보이지만 3가지의 문제를 내포하고 있다. +- n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. +- n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. + +```java +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 가량이 중간값보다 낮은 쪽으로 쏠린 것이다. +- 지정한 범위 바깥의 수가 종종 튀어나올 수 있다. rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문이다. + +### 표준 라이브러리를 사용하면 다른 프로그래머들의 경험을 활용할 수 있다. +- 메서드의 동작 방식은 몰라도 알고리즘에 능통한 개발자나, 여러 분야의 전문가가 설계와 구현에 시간을 들여 개발한 것이다. +- 버그가 발생되더라도 다음 릴리스에 수정 보완 개선이 될 수 있다. +- 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다. +- 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 되고 어플리케이션 기능 개발에 집중할 수 있다. +- 따로 노력하지 않아도 릴리즈가 나올 때 마다 성능이 지속해서 개선된다. +- 기능이 점점 많아진다. 개발자 커뮤니티에서 나온 이야기를 바탕으로 논의 후 다음 릴리즈에 기능이 추가되곤 한다. +- 라이브러리를 사용하면 많은 사람들에게 낯익은 코드가 된다. 다른 개발자들이 유지보수 하기 쉬워지고 재사용성이 높아진다. + +### 메이저 버전 릴리즈 마다 수많은 기능이 추가된다. +- 자바는 메이저 릴리즈마다 새로운 기능을 설명하는 웹페이지를 공시한다. +- 한 번쯤은 읽어볼만 하다 +- 너무 많아서 읽기 힘든 경우에는 java.lang, java.util, java.io와 하위 패키지들에는 익숙해져야 한다. +- 컬렉션 프레임워크나 concurrent 패키지는 알아두면 도움이 된다. + +### 예시 - transferTo 메서드를 이용해 URL 내용 가져오기 +```java +public static void main(String[] args) throws IOException { + try (InputStream in = new URL(args[0]).openStream()) { + in.transferTo(System.out); + } +} +``` +- java 9 버전 부터 URL정보를 쉽게 출력해 주는 transferTo 메서드를 제공한다. + +### 정리 +- 라이브러리가 전문적인 기능을 제공해 주지 못할수도 있지만, 라이브러리를 일단 사용해보자 +- 특별한 기능이 아니라면 누군가 라이브러리로 만들어 두었을 가능성이 높다. +- 일단 라이브러리가 있는지 찾아보자 +- 일반적으로 라이브러리의 코드는 개발자가 작성한 것보다 품질이 좋고 개선의 여지가 있다. +- 라이브러리 코드는 주목을 많이 받고 개발자 커뮤니티에서 문제점이 많이 거론되므로 코드 품질이 점차 좋아진다. \ No newline at end of file