55. 옵셔널 반환은 신중히 하라
값의 부재(Absence)를 어떻게 다룰 것인가?
예외(Exception) 던지기
// 예시: 사용자를 못 찾으면 예외 던지기
public User findUserOrThrow(String id) throws UserNotFoundException {
User user = // ... ID로 사용자 찾는 로직 ...
if (user == null) {
throw new UserNotFoundException(id + " 사용자를 찾을 수 없음");
}
return user;
}try {
User user = findUserOrThrow("someId");
} catch (UserNotFoundException e) {
System.err.println(e.getMessage());
}null 반환
자바 8의 대안: Optional
개념
목적 및 장점
Optional 사용법: 생성 및 반환
Optional 객체 생성 방법
예시: 컬렉션 최댓값 구하기
Optional을 반환해야 하는 경우
핵심 원칙 : 메서드 실행 결과 값이 없을 가능성이 있고, 그 상태를 호출자가 명시적으로 인지하고 처리하도록 강제하고 싶을 때Optional<T>반환을 고려
반환된 Optional 처리 방법
기본값 지정 : orElse(defaultValue)
orElse(defaultValue)예외 던지기 : orElseThrow(exceptionSupplier)
orElseThrow(exceptionSupplier)값 직접 얻기 (주의!) : get()
get()기본값 지연 계산 : orElseGet(supplier)
orElseGet(supplier)값 필터링 : filter(predicate)
filter(predicate)값 변환 : map(function)
map(function)중첩된 Optional 처리 : flatMap(function)
flatMap(function)값이 있을 때만 동작 수행 : ifPresent(consumer)
ifPresent(consumer)존재 여부 확인 (주의!) : isPresent()
isPresent()Optional을 사용하면 안 되는 경우
성능이 극도로 중요한 경우
컨테이너 타입 래핑
박싱된 기본 타입 래핑
컬렉션의 요소/키/값, 배열 요소
인스턴스 필드
신중한 Optional 반환 실천 체크리스트
DO
DON'T
핵심 요약
Optional<T>는 자바 8 이후 값의 부재 가능성을 명확히 알리고 NPE를 방지하는 데 도움을 주는 강력하고 유용한 도구
주된 용도는 메서드의 반환 타입으로, 호출자에게 '값이 없을 수 있음'을 명시하고 관련 처리를 강제하고자 할 때 효과적
Optional API(orElse, map, ifPresent 등)를 잘 활용하면 코드를 더 선언적이고 안전하며 간결하게 작성 가능
성능, 컨테이너 래핑, 박싱된 기본 타입, 컬렉션/배열 요소, 필드 등에는 사용을 신중히 하거나 피해야 합니다
Optional은 만병통치약이 아니므로, 상황에 맞게 적절히 사용해야 합니다
Last updated