본문 바로가기

Effective Java

[Effective Java] 아이템 59 - 라이브러리를 익히고 사용하라

개요

도입으로써 난수 발생 예제를 확인해보자

static Random rnd = new Random();

static int Random(int n){
	return Math.abs(rnd.nextInt()) % n;
}

위 코드는 크게 세 가지의 문제를 가지고 있다.

문제 1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.

문제 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.

문제 3. 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다. (rnd.nextInt() 와 Math.abs()의 Integer처리 때문)

 

위 결함을 해결하기 위해서는 의사난수 생성기, 정수론, 2의 보수 계산 등에 대한 지식이 필요한데...

우리는 그것을 알 필요가 없다(라기보다는 굳이 알려고 노력할 필요는 없다)

 

Random보다는 ThreadLocalRandom으로 대체하여 사용하자.

 


표준 라이브러리

장점 1. 표준 라이브러리를 사용하면 코드를 작성한 전문가의 지식과 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다는 점

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

장점 3. 따로 노력하지 않아도 성능이 지속해서 개선된다는 점

장점 4. 기능이 점점 많아진다는 점

장점 5. 내가 작성한 코드가 다른 프로그래머에게 낯익은 코드가 된다는 점

 

위와 같은 장점들이 많은데도 불구하고 많은 프로그래머들은 라이브러리를 사용하기보다는 직접 구현을 하는 경우가 많이 존재한다.

그 이유는 무엇일까?

라이브러리 내 구현하고자 하는 기능이 존재한다는 것을 모르기 때문!

 

자바의 메이저 릴리스마다 주목할 만한 수많은 기능들이 라이브러리에 추가되고 이러한 기능들을 설명하는 웹페이지를 공시해준다.

 

내용이 너무 많다.

그렇다면?

 

적어도 java.lang, java.util, java.io와  그 하위 패키지들에 대해서는 익숙해져야 한다. 

추가적으로 언급할 만한 라이브러리는 Collection FrameworkStream Library이다. +java.util.concurrent+

 

어떠한 기능을 구현하는데 있어 우선적으로 구현되어 있는 라이브러리를 찾아보자

만약 구현하고자 하는 기능에 대한 라이브러리가 없다면....그 때 직접 구현하자!

 


핵심 정리

바퀴를 다시 발명하지 말자. 아주 특별한 나만의 기능이 아니라면 누군가 이미 라이브러리 형태로 구현해놓았을 가능성이 크다. 그런 라이브러리가 있다면, 쓰면 된다. 있는지 잘 모르겠다면 찾아보라.

일반적으로 라이브러리의 코드는 여러분이 직접 작성한 것보다 품질이 좋고, 점차 개선될 가능성이 크다. 코드 품질에도 규모의 경제가 적용된다.

즉, 라이브러리 코드는 개발자 각자가 작성하는 것보다 주목을 훨씬 많이 받으므로 코드 품질도 그만큼 높아진다.

 

.라이브러리 쓰자.