Optional<T>

Heeeoh·2024년 3월 5일
0

JAVA

목록 보기
2/2
post-thumbnail

✔️ Optional이란 ?

Optional은 NullPointException 발생 방지를 위해 사용 Java8

Optional<T>는 null 이 올 수 있는 값을 감싸는 Wrapper 클래스


✔️ null 체크

기존에는 if문을 사용해서 null 체크

List<String> list = store.get("itemName");
if ( list == null) {
	log.info("없는 상품");
    // 처리 
}
public final class Optional<T> {
    /**
     *  빈 optional을 공통객체로서 가지고 있다. 
     */
    private static final Optional<?> EMPTY = new Optional<>(null);

    /**
     * null이 아닐 경우 값이 담기고, null 일 경우null 이 담긴다. 
     */
    private final T value;
    
    // 생성자 
    private Optional(T value) {
        this.value = value;
    }
}    
    

✔️ 메서드


empty()

public static<T> Optional<T> empty() {
	@SuppressWarnings("unchecked") // 컴파일 경고를 사용하지 않도록 설정
	Optional<T> t = (Optional<T>) EMPTY;
	return t;
}

공통 객체로 갖고 있는 빈 optional을 반환한다.


of(T value)

public static <T> Optional<T> of(T value) {
	return new Optional<>(Objects.requireNonNull(value));
}

null 체크
value 가 null이면 requireNonNull()에서 NPE을 던진다.


ofNullable(T value)

public static <T> Optional<T> ofNullable(T value) {
	return value == null ? (Optional<T>) EMPTY : new Optional<>(value);
}

null일 가능성이 있는 value를 파라미터로 넘긴다.
null : Optional EMPTY를 반환 , (빈 공통 객체)
non-null : new Optional<>(value) 반환


isPresent()

public boolean isPresent() {
	return value != null;
}

ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
	if (value != null) {
		action.accept(value);
	} else {
		emptyAction.run();
	}
}

처음 파라미터는 Optional 객체에 값이 null이 아닐때 실행되는 Consumer 를 받고,
두 번째 파라미터는 Optional 객체의 값이 null일 때 실행되는 Runnable을 받는다.

둘다 함수형 인터페이스이기에 람다식이 가능하다.


orElse(T other)

public T orElse(T other) {
	return value != null ? value : other;
}

Optional이 null 이 아니면 value 반환
null 이라면 파라미터로 들어온 other을 그대로 반환


orElseGet(Supplier<? extends T> supplier)

public T orElseGet(Supplier<? extends T> supplier) {
	return value != null ? value : supplier.get();
}

Supplier 라는 함수형 인터페이스가 있기에 람다식을 사용할 수 있다.
값이 Optonal 에 있으면 value를 반환,
없으면 Supplier 에서 생성된 결과 반환


orElseThrow()

public T orElseThrow() {
	if (value == null) {
		throw new NoSuchElementException("No value present");
	}
	return value;
}

OPtional에 값이 있으면 반환
없으면 NoSuchElementException을 던진다.


Optional은 반환형으로만 사용하자

반환타입으로 값이 있는지 여부를 확인하기 위해 탄생했다.

그외

map, filter 등 많이 있다 필요할 때 찾아서 사용하자


✔️ 다른 분이 정리하신 것

[ 올바른 Optional 사용법 가이드 ]

  • Optional 변수에 Null을 할당하지 말아라
  • 값이 없을 때 Optional.orElseX()로 기본 값을 반환하라
  • 단순히 값을 얻으려는 목적으로만 Optional을 사용하지 마라
  • 생성자, 수정자, 메소드 파라미터 등으로 Optional을 넘기지 마라
  • Collection의 경우 Optional이 아닌 빈 Collection을 사용하라
  • 반환 타입으로만 사용하라

출처: https://mangkyu.tistory.com/203 [MangKyu's Diary:티스토리]

profile
열심히 살자

0개의 댓글