[Java] Optional

Wooyong Jung·2023년 12월 8일
0

Java

목록 보기
4/4
post-thumbnail
post-custom-banner

Optional이란?

메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, 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 객체를 반환


  • isPresent()-get() 대신 orElse()/orElseGet()/orElseThrow()
  • orElse(new ...) 대신 orElseGet(() -> new ...)
  • 단지 값을 얻을 목적이라면 Optional 대신 null 비교
  • Optional 대신 비어있는 컬렉션 반환
  • Optional을 필드로 사용 금지
  • Optional을 생성자나 메서드 인자로 사용 금지
  • Optional을 컬렉션의 원소로 사용 금지
  • of(), ofNullable() 혼동 주의
  • Optional 대신 OptionalInt, OptionalLong, OptionalDouble

참고

Java Optional 바르게 쓰기

Java @Optional

profile
실패를 두려워하지 않는 백엔드 개발자가 되기 위해 노력하고 있습니다.
post-custom-banner

0개의 댓글