티스토리 뷰

* 이펙티브 자바 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을 활용해 감싸서 반환하자.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함