개발서적/Effective Java
[Effective Java] 공개된 API 요소에는 항상 문서화 주석을 작성하라
공개된 API에는 문서화 주석을 달자 API를 올바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 한다. 직렬화할 수 있는 클래스라면 직렬화 형태에 관해서도 적어야 한다. 메서드용 문서화 주석 메서드용 문서화 주석에는 해당 메서드와 클라이언트 사이의 규약을 명료하게 기술해야 한다. 어떻게 동작하는지가 아닌, 무엇을 하는지를 기술해야 한다. 문서화 주석에는 클라이언트가 해당 메서드를 호출하기 위한 전제조건을 모두 나열해야 한다. 일반적으로 전제조건은 @throws 태그로 비검사 예외를 선언하여 암시적으로 기술한다. @param 태그를 이용해 그 조건에 영향받는 매개변수에 기술할 수도 있다. 메서드가 성공적으로 수행된 후에 만족해야 하는 사후조건을 나열해야 한다...
[Effective Java] 옵셔널 반환은 신중히 하라
메서드가 특정 조건에서 값을 반환할 수 없을 때 취하는 2가지 방법 (자바 8이전) 1. 예외를 던진다. 예외는 진짜 예외적인 상황에서만 사용해야 하며 예외를 생성할 때 스택 추적 전체를 캡쳐하므로 비용이 만만치 않다. 2. null을 반환한다. null을 반환할 수 있는 메서드를 호출할 때는 별도의 nmull 처리 코드를 추가해야 한다. Optional의 등장 자바 8 이후로 null이 아닌 T타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 옵셔널은 원소를 최대 1개 가질 수 있는 '불변' 컬렉션이다. 옵셔널을 반환하는 메서드는 예외를 던지는 메서드보다 유연하고 사용하기 쉬우며, null을 반환하는 메서드보다 오류 가능성이 작다. 옵셔널을 반환하도록 구현하기 위해서는 적절한 정적 팩터리를..
[Effective Java] null이 아닌, 빈 컬렉션이나 배열을 반환하라
컬렉션이 비었으면 null을 반환하는 코드 public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheeseInStock); } 사실 재고가 없다고 해서 특별히 취급할 이유는 없다. 그럼에도 이 코드처럼 null을 반환한다면 클라이언트는 이 null 상황을 처리하는 코드를 추가로 작성해야 한다. null을 반환하면 안되는 이유 성능 분석 결과 빈 컬렉션의 할당이 성능 저하의 주범이라고 확인되지 않는 한 이 정도의 성능 차이는 신경 쓸 수준이 못 된다. 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다. 빈 컬렉션을 반환하는 올바른 예 public List getCheeses() { return new..
[Effective Java] 가변인수를 신중히 사용하라
가변인수 가변인수는 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 젖아하여 가변인수 메서드에 건네준다. 인수가 1개 이상이어야 할 때 static int min(int... args) { if (args.length == 0) throw new IllegalArgumentException("인수가 1개 이상 필요합니다."); int min = args[0]; for (int i = 1; i < args.length; i++) if (args[i] < min) min = args[i]; return min; } 위 코드는 다음과 같은 문제가 있다. 인수를 0개만 넣어 호출하면 런타임에 실패한다. 코드가 지..
[Effective Java] 다중정의는 신중히 사용하라
다중정의를 잘못한 컬렉션 분류기 다음 컬렉션 분류기는 "집합", "리스트", "그 외"를 차례로 출력할 것 같지만, "그 외"만 세번 연달아 출력한다. public class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List lst) { return "리스트"; } public static String classify(Collection c) { return "그 외"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), n..