Search

아이템55 : 옵셔널 반환은 신중히 하라

메서드가 특정 조건에서 값을 반환할 수 없는 경우, 자바 8 이전과 이후로 나누어 알아보려고 한다.

 자바 8 이전

 1. 예외를 던지는 방법

예외는 진짜 예외적인 상황에서만 사용해야 한다.
예외 생성 시 스택 추적 전체를 캡처하므로 비용이 만만치 않다.

 2. null을 반환하는 방법

별도의 null 처리 코드를 추가해야 한다.
null 처리를 무시하면 NullPointerException이 발생할 수 있다.

 자바 8 이후

 Optional<T>이란?

옵셔녈은 T 타입 참조를 하나 담거나, 아무것도 담지 않을 수 있다.
//빈 옵셔널 Optional.empty(); //값이 든 옵셔널(null을 넣으면 NPE 발생 Optional.of(result);
Java
원소를 최대 1개 가질 수 있는 불변 컬렉션이다.

 어떤 장점이 있을까?

유연하고 사용하기 쉽다.
null을 반환하는 메서드보다 오류 가능성이 적다.

 옵셔널은 언제 사용해야 할까?

검사 예외(Checked Exception)와 취지가 비슷하다. (아이템 71 : 필요 없는 검사 예외 사용은 피하라)
옵셔널은 검사 예외를 회피하는 방법 중 하나이다.
반환값이 없을 수도 있음을 API 사용자에게 명확히 알려줄 수 있다.
클라이언트에서 값을 받지 못했을 때 취할 행동을 선택하게 할 수 있다.
result.orElse("값이 없으면 기본값으로 설정"); result.orElseThrow(CustumException::new); result.get();
Java

 옵셔널을 무조건 사용하는 것이 좋을까?

무조건 득이 되지는 않는다.
컬렉션, 스트림, 배열, 옵셔널 같은 컨테이너 타입은 옵셔널로 감싸지 말자.
ex) Optional<List<T>>빈 List<T>
성능 저하가 따르니 이를 고려해야 한다.
박싱된 기본 타임을 담는 옵셔널은 기본 타입 자체보다 무겁다.
옵셔널을 맵의 값으로 사용하지 말자.
맵 안에 키가 없다는 사실을 나타내는 꼴이다.
쓸데없이 복잡해져 오류 가능성을 키울 수 있다.

 핵심 요약

값을 반환하지 못할 가능성이 있고, 호출할 때마다 반환값이 없을 가능성을 염두한다면 옵셔널을 고려하자.
성능에 민감하다면 null이나 예외를 던지는 편이 나을 수 있으니 상황에 맞게 사용하자