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

자바 8이전에는 메서드가 특정 값을 반환할 수 없을때 취할 수 있는 선택지가 두 가지가 있었습니다. 예외를 던지거나, null을 반환하는 것입니다. 두 방법 모두 허점이 있습니다. 예외는 진짜 예외적인 상황에서만 사용해야 하며 예외를 생성할 때 스택 추적 전체를 캡쳐하므로 바용도 만만치 않습니다. null을 반환할 수 있는 메서드를 호출하면 null 처리를 별도로 해줘야합니다. null 처리를 무시하면 나중에 NPE가 발생할 수 있습니다.



자바 8부터는 Optional을 지원했습니다. Optional<T>는 null이 아닌 T타입 참조를 하나 담거나, 아무것도 담지 않을 수 있습니다. optional을 이용하면 예외를 던지느 메서드보다 더 유연하고, null을 반환하는 메서드보다 오류 가능성이 적습니다.
하지만 그렇다고 Optional을 남발해서는 안 됩니다. 대표적으로 컬렉션, 스트림, 배열, 옵셔널 같은 컨테이너 타입은 옵셔널로 반환하면 안 됩니다. 빈 컨테이너를 그대로 반환하면 클라이언트에 옵셔널 처리 코드를 넣지 않아도 됩니다.

Optional도 새로 할당하고 초기화해야 하는 객체이고, 그 안에서 값을 꺼내는 메서드를 호출하는 단계를 추가롤 거쳐야 합니다. 박싱된 기본 타입을 감싸는 Optional같은 경우 값을 두 번이나 감싸니 기본 타입보다 훨씬 무거울 수 밖에 없습니다. 그래서 OptionalInt, OptionalLong, OptionalDouble을 제공하니 박싱된 기본 타입을 담은 Optional은 사용하는 일이 없도록 합시다.