개발서적/Effective Java
[Effective Java] 메서드 시그니처를 신중히 설계하라
메서드 시그니처를 신중히 설계하라 1. 메서드 이름을 신중히 짓자. 표준 명명 규칙을 따라야 이해할 수 있다. 같은 패키지에 속한 다름 이름들과 일관되게 이름을 짓자 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자 애매하면 자바 라이브러리의 API 가이드를 참조하라 2. 편의 메서드를 너무 많이 만들지 말자. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고,, 유지보수하기 어렵다 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두자. 확신이 서지 않으면 만들지 말자 3. 매개변수 목록은 짧게 유지하자. 4개 이하가 좋다 [과하게 긴 매개변수 목록을 짧게 줄여주는 세 가지 방법] 여러 메서드로 쪼개고 메서드 각각은 원래 매개변수 목록의 부분집합을 받는다. ex ) 지정된 범위의 ..
[Effective Java] 적시에 방어적 복사본을 만들라
방어적 프로그래밍 자바는 안전한 언어이지만, 다른 클래스로부터의 침범을 다 막을 수 있는 건 아니다. 따라서 클라이언트가 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다. 불변식을 지키지 못한 예시 public final class Period { private final Date start; private final Date end; public Date start() { return start; } public Date end() { return end; } } 다음 코드는 불변같지만, Date가 가변이라는 사실을 이용하면 어렵지 않게 그 불변식을 깨뜨릴 수 있다. Date start = new Date(); Date end = new Date(); Period p = n..
[Effective Java] 매개변수가 유효한지 검사하라
메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다. 예를 들면 인덱스는 음수 값이 아니라던지, 객체는 null이 아니여야 한다. 이런 제약은 반드시 문서화해야 하며 메서드 몸체가 시작되기 전에 검사해야 한다. 매개변수는 메서드 몸체가 실행되기 전에 확인해야 한다. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다. 매개변수를 잘못 검사하면 다음과 같은 문제가 발생하기 때문에 꼭 메서드 몸체가 실행되기 전에 확인하자 메서드가 수행되는 중간에 모호한 예외를 던지며 실패할 수 있다. 메서드가 잘 수행되었지만 잘못된 결과를 반환할 수 있다. 메서드는 문제없이 수행됐지만, 어떤 객체를 이상한 상태로 만들어놓아서 미..
[Effective Java] 스트림 병렬화는 주의해서 적용하라
자바의 동시성 프로그래밍 첫 릴리스에서부터 스레드, 동기화, wait/notify를 지원했다. 자바 5부터는 동시성 컬렉션인 java.util.concurrent 라이브러리와 실행자 프레임워크를 지원했다. 자바 7부터는 고성능 병렬 분해 프레임워크 포크-조인 패키지를 추가했다. 자바 8부터는 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원했다. 동시성 프로그래밍에서는 안전성과 응답 기능 상태를 유지하는 것이 중요한 포인트인데, 자바의 많은 지원에도 올바르고 빠르게 작성하는 일은 여전히 어렵다. 병렬 스트림의 잘못된 사용 다음은 스트림을 사용해 처음 20개의 메르센 소수를 생성하는 프로그램이다. public static void main(String[]args){ ..
[Effective Java] 스트림에서는 부작용 없는 함수를 사용하라
스트림 패러다임 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다. 이때 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수 함수이여야 한다. 순수 함수 오직 입력만이 결과에 영향을 주는 함수 스트림의 잘못된 사용 예시 Map freq = new HashMap(); try (Stream words = new Scanner(file).tokens()) { words.forEach(word -> { freq.merge(word.toLowerCase(), 1L, Long::sum); }) } 위 코드는 외부 상태(빈도표)를 수정하는 람다를 실행하면서 문제가 생긴다. (merge) forEach 연산은 스트림 계산 결과를 보여주는 일 이상을 하지 않는 것이 좋다. 잘 사용한 예시..