메서드가 특정 조건에서 값을 반환할 수 없는 경우, 자바 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이나 예외를 던지는 편이 나을 수 있으니 상황에 맞게 사용하자