티스토리 뷰
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 |
- Total
- Today
- Yesterday
- JS 딥다이브
- ㅇㄷㅇㅈ
- js array
- 패스트캠퍼스 컴퓨터공학 완주반
- HTTP 완벽 가이드
- REST API
- 이펙티브자바 아이템59
- 이펙티브자바
- js api
- http
- BOJ
- 프로그래머스
- java
- 김영한 http
- 모던자바스크립트
- 이펙티브자바 스터디
- 백기선 스터디
- 이펙티브자바 아이템60
- HTTP 완벽가이드
- JPA 연관관계 매핑
- 가상 면접 사례로 배우는 대규모 시스템 설계 기초
- js promise
- Spring Security
- 백준
- 드림코딩
- GCP
- dreamcoding
- 킹수빈닷컴
- 프로그래머스 SQL
- 김영한 JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |