본문 바로가기

회고/이펙티브 자바 3판

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

반응형

무작위 정수를 하나 생성하고 싶을 때 어떻게 코드를 짤 수 있을까? 값의 범위는 0부터 명시한 숫자 사이이다.

 

흔하지만 문제가 심각한 코드

static Random rnd = new Random();

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

이 코드는 다음과 같은 문제가 있다.

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

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

 

 무작위 수 백만개를 생성한 다음, 그 중 중간 값보다 작은 게 몇 개인지를 출력한다

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가 중간값보다 낮은 쪽으로 쏠린 것이다. 가끔, 지정한 범위 '바깥'의 수가 종종 튈 수 있다.

 

 이와 같은 결함을 해결하려면 ㅡ이사난수 생성기, 정수론, 2의 보수 계산 등에 조예가 깊어야 한다. 하지만 다행히 프로그래머는 직접 해결할 필요가 없다. Random.nextInt(int)가 이미 해결해놨다. 이 메서드의 자세한 동작 방식은 몰라도 된다. 알고리즘에 능통한 개발자가 설계와 구현과 검증에 시간을 들여 개발했고, 이 분야의 여러 전문가가 잘 동작함을 증명했다. 버그가 발견되더라도 다음 릴리즈에서 수정 될 것이다. 표준 라이브러리를 사용하면 그 코드를 작성한 전문가와 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용 할 수 있다.

 

표준 라이브러리의 두 번째 이점은 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다는 것이다.

 

세 번째 이점은 따로 노력하지 않아도 선응이 지속해서 개선된다는 점이다.

 

네 번째 이점은 기능이 점점 많아진다는 것이다.

 

마지막 이점은 프로그래머가 작성한 코드가 많은 사람에게 낯익은 코드가 된다는 것이다.

 

 하지만 프로그래머들은 표준 라이브러리 기능의 사용을 잘 하지 않고 실상 직접 구현해 사용하고 있다. 그것은 아마 라이브러리에 그런 기느이 있는지 모르기 때문일 것이다. 메이저 릴리즈다 주목할 만한 수많은 기능이 라이브러리에 추가된다. 따라서 자바는 메이저 릴리즈마다 새로운 기능을 웹페이지에 공시하므로 한번쯤 읽어볼 만하다

 

 라이브러리가 너무 방대하여 모든 API 문서를 공부하기 벅차겠지만, 자바 프로그래머라면 적어도 java.lang, java.util, java.io와 그 하위 패키지들에는 익숙해져야 한다. 다른 라이브러리들은 필요할 떄마다 익히면 좋다. 이외에 컬렉션 프레임워크, 스트림 라이브러리, java.util.concurrent의 동시성 기능도 알아두면 큰 도움이 된다.

 

*느낀점

새로운 기능과 API가 나온다는 것은 평소의 불편한 점을 개선하기 위해 만들어졌을 것이다. 책에서 말하고 있는 것처럼, 자바 프로그래머로서 기본 패키지에 능숙해지고, 람다와 스트림에도 적응하도록 노력해야 겠다. 단순한 문법들이라도 주석 설명을 보면서 원리를 잘 공부해야 한다고 배웠다. 아직 자바 8에 대한 내용도 벅찬데, 지금 15버전도 있다. 열심히 문서를 통해서 필요한 기능과 내용에 대한 API를 찾아보고 학습하는 습관을 길러야겠다.

반응형