-
아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라책/이펙티브자바 2021. 9. 17. 17:34
Collection
// BAD - 컬렉션이 비었을때 null 을 리턴한다. private final List<Cheese> cheesesInStock = ...; public List<Cheese> getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList<>(cheesesInStock); }
위 코드는 치즈 재고를 List 로 반환하는 메소드인데 재고가 없으면 null 을 리턴한다.
근데 사실 재고가 없다고 해서 특별히 취급할 이유는 없다.
근데도 이렇게 null 을 반환한다면, 클라이언트는 이 null 을 처리하는 코드를 추가로 작성해야 한다.
List<Cheese> cheeses = shop.getCheeses(); if (cheeses != null && cheeses.contains(Cheese.STILTON)) {...}
null 체크를 빼먹으면 오류가 발생할 수 있기에 위와 같이 클라이언트 쪽에서 cheeses ≠ null 인지 체크해줘야한다.
빈 컬렉션의 단점 ???
때로는 빈 컨테이너를 할당하는데도 비용이 드니 null 반환이 낫다는 주장도 있다.
하지만 이는 잘못된 주장이다.
첫 째, 이 정도의 성능 차이는 신경 쓸 수준이 못 된다.
둘 째, 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다.
// 빈 컬렉션을 반환하는 법 public List<Cheese> getCheeses() { return new ArrayList<>(cheesesInStock); }
가능성은 작지만, 사용 패턴에 따라 빈 컬렉션 할당이 성능을 눈에 띄게 떨어뜨릴 수도 있다.
다행히 해법은 간단하다. 매번 똑같은 빈 '불변' 컬렉션을 반환하는 것이다.
List의 경우 Collections.emptyList, Set의 경우 Collections.emptySet, Map의 경우 Collections.emptyMap 을 사용하면 된다. 단, 이 역시 최적화에(Item67) 해당하니 꼭 필요할 때만 사용하자.
최적화가 필요하다고 판단되면 수정 전과 후의 성능을 측정하여 실제로 성능이 개선되는지 꼭 확인하자.
// 빈 컬렉션을 매번 새로 할당하지 않게끔 한다. public List<Cheese> getCheese() { return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock); }
Array
배열도 마찬가지다. 절대 null 을 반환하지 말고 길이가 0인 배열을 반환하자.
보통은 정확한 길이의 배열을 반환하면 된다. 그 길이가 0일 수도 있을 뿐이다.
public Cheese[] getCheese() { return cheesesInStock.toArray(new Cheese[0]); }
이 방식이 성능을 떨어뜨릴 것 같다면 길이 0짜리 배열을 미리 선언해두고 매번 그 배열을 반환하자.
길이가 0인 배열은 모두 불변이다.
// 빈 배열을 매번 새로 할당하지 않게끔 했다. private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0]; public Cheese[] getCheeses() { return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY); }
// BAD - 배열을 미리 할당하면 성능이 나빠진다. return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]);
성능 개선을 목적으로 toArray에 넘기는 배열을 미리 할당하는 건 추천하지 않는다.
오히려 성능이 떨어진다는 연구 결과도 있다.
결론
- null 이 아닌 빈 배열이나 컬렉션을 반환하라.
'책 > 이펙티브자바' 카테고리의 다른 글
아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라 (0) 2021.09.17 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) 2021.09.17 아이템 53. 가변인수는 신중히 사용하라 (0) 2021.09.17 아이템 60. 정확한 답이 필요하다면 float와 double은 피하라 (0) 2021.09.16 아이템 59. 라이브러리를 익히고 사용하라 (0) 2021.09.16