티스토리 뷰
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다.
43. null보다는 빈 배열이나 컬렉션을 반환하라
빈 배열이나 컬렉션을 반환하는 대신 null을 반환하는 메서드를 사용하게 되면 오류가 발생하기 쉽다.
- 클라이언트가 null 처리 과정을 빼먹을 수도 있기 때문.
- null을 반환하는 메서드는 상대적으로 구현하기도 더 까다롭다.
배열 할당 비용을 피할 수 있으니 null을 반환하는 것이 좋다는 주장은 틀린 부분이 있다
1. 성능 걱정을 할 정도의 수준이 아니다.
2. 길이가 0인 배열은 변경이 불가능하므로 아무 제약없이 재사용할 수 있다.
그리고 책이 오래되서 그런건지 모르겠는데 개인적으로는 이런 경우에 Optional을 쓰는것이 좋지 않나? 생각이 들기도 한다. Optional에 대해서나 좀 더 알아보자.
* optional은 생성 비용이 비싸기 때문에 꼭 필요한 경우에 사용하는 것이 좋다.
java.util.Optional<T> 클래스
'T' 타입의 객체를 포장해주는 Wrapper 클래스.
- 모든 타입의 참조 변수를 저장할 수 있다.
- 복잡한 조건문 if-else 없이 깔끔하게 null로 인해 발생하는 예외를 처리할 수 있게 해준다.
<생성>
빈 Optional 객체를 만들 때: Optional.empty()
Null을 담을 수 없는 Optional 객체를 만들 때: Optional.of()
-> null을 넣으면 NPE 발생
Null도 들어가는 Optional 객체를 만들 때: Optional.ofNullable()
* Optional 변수 자체에 Null을 할당하지 마라
Optional<String> opt = null; // (X)
Optional<String> opt = Optional.empty() // (O)
- Optional 변수 자체가 null인지를 또 검사해야 하는 번거로움이 생긴다.
- null을 담고있는 Optional 객체를 만드려면 Optional.empty()를 사용해라.
<접근>
boolean isPresent()
- Optional 객체의 값이 존재하는지? (null이 아닌지?)
T get()
- Optional 객체의 Wrapping을 벗긴다.
- Optional 객체에 null이 저장되어 있었다면 그대로 NPE가 발생함
-> 값을 꺼내기 전에 null 체크를 거쳐야함 (isPresent() 등)
* isPresent -> get 으로 값을 꺼내는 것 보다는 orElse~ 메서드를 활용해라
// BAD
if(opt.isPresent()) {
String result = opt.get();
...
}
// GOOD
String result = opt.orElse("ERROR");
...
T orElse(T other)
- 저장된 값이 존재하면 그 값을 반환하고, 값이 없다면 파라미터로 전달된 값(T other)을 반환
- HashMap에서 getOrDefault 메서드랑 비슷한 느낌
T orElseGet(Supplier<? extends T> supplier)
- 저장된 값이 존재하면 그 값을 반환하고, 없다면 파라미터로 전달된 람다식 실행결과를 반환
T orElseThrow()
- 저장된 값이 존재하면 그 값을 반환하고, 없다면 파라미터로 전달된 예외를 발생시킴
- 전달된 파라미터가 없다면 기본적으로 NoSuchElementException을 발생시킴.
* 이외 null을 반환하는 메서드가 아닌데 단순히 값을 넘겨줄 목적으로 Optional을 사용하지 마라
* 파라미터로 Optional을 넘기지 마라. 의도에 맞게 리턴값 넘겨주는 용도로만 사용해라.
* Collection의 경우는 Optional을 사용할 필요가 없다. 빈 컬렉션을 넘겨주는게 훨씬 가볍고 깔끔하다.
// 이런거 굳이 사용하지 마라.
Optional<List<String>> opt = Optional.of(new ArrayList<>());
(참고)
http://www.tcpschool.com/java/java_stream_optional
https://mangkyu.tistory.com/203
(결론)
Collection의 경우는 빈 Collection, 배열의 경우에는 빈 배열을 반환하고, 이외의 경우에는 Optional을 활용해 감싸서 반환하자.
'JAVA' 카테고리의 다른 글
자바의 JVM과 클래스 로더를 알아보자 (0) | 2022.08.03 |
---|---|
나머지 자바 공부 (0) | 2022.08.01 |
오버로딩과 오버라이딩 (0) | 2022.07.29 |
메서드 설계는 신중하게 (0) | 2022.07.28 |
메서드 앞에서 인자의 유효성을 검사하라 (0) | 2022.07.27 |