메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, null
을 반환하면 에러를 유발할 가능성이 높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적이다. Optional 타입의 변수의 값은 절대 null이어서는 안 되며, 항상 Optional 인스턴스를 가리켜야 한다.
public void saveItem(Item item) {
if(item != null) {
...
}
}
Optional
을 사용한다면 위와 같은 불필요한 null check를 하지 않고도 NullPointerException
을 방지할 수 있다.
Optional<T>
클래스 사용법메소드 | 설명 |
---|---|
T orElse(T other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환 |
T orElseGet(Supplier<? extends T> other) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 람다 표현식의 결과값 반환 |
T orElseThrow(Supplier<? extends X> exceptionSupplier) | 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생 |
static Optional empty() | 아무런 값도 가지지 않는 비어있는 Optional 객체를 반환 |
T get() | Optional 객체에 저장된 값을 반환 |
boolean isPresent() | 저장된 값이 존재하면 true를 반환하고, 값이 존재하지 않으면 false를 반환 |
static Optional of(T value) | null이 아닌 명시된 값을 가지는 Optional 객체를 반환 |
static Optional ofNullable(T value) | 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환 |
✏️ orElse(), orElseGet(), orElseThrow()
Optional<Member> member = ...;
return member.orElse("empty"); //member가 null이면 "empty" 반환
return member.orElseThrow(() -> new NoSuchElementException()) //member가 null이면 NoSuchElementException 처리
orElse(...)
에서 ...는 Optional
에 값이 있든 없든 무조건 실행되고
orElseGet(...)
에서 ...은 null일 때만 호출된다.
✏️ isEmpty(), isPresent()
Optional<Member> member = Optional.empty();
System.out.println(member.isEmpty()); //true
System.out.println(member.isPresent()); //false
null 여부를 판단할 수 있다.
✏️ ofNullable()
Optional<String> optional = Optional.ofNullable(getString());
명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환
Java Optional 바르게 쓰기
Java @Optional