-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
1 changed file
with
61 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 메서드를 제공한다. | ||
|
||
### 정리 | ||
- 라이브러리가 전문적인 기능을 제공해 주지 못할수도 있지만, 라이브러리를 일단 사용해보자 | ||
- 특별한 기능이 아니라면 누군가 라이브러리로 만들어 두었을 가능성이 높다. | ||
- 일단 라이브러리가 있는지 찾아보자 | ||
- 일반적으로 라이브러리의 코드는 개발자가 작성한 것보다 품질이 좋고 개선의 여지가 있다. | ||
- 라이브러리 코드는 주목을 많이 받고 개발자 커뮤니티에서 문제점이 많이 거론되므로 코드 품질이 점차 좋아진다. |