1. Optional <T>란?
Optional<T>는 Java 8에서 도입된 클래스이며, null이 될 수 있는 값을 감싸는 컨테이너 역할을 한다. 이를 통해 null 값 처리에 대한 명시적인 방법을 제공하며, NullPointerException을 방지하는 데 도움을 준다. Optional 클래스는 다양한 메서드를 제공하여 값의 존재 여부를 처리할 수 있다.
2. Method
static <T> Optional<T> empty()
- 비어있는 Optional 객체를 반환한다.
- 예시: Optional<String> opt = Optional.empty();
static <T> Optional<T> of(T value)
- null이 아닌 값을 감싸는 Optional 객체를 생성한다.
- null 값을 전달하면 NullPointerException이 발생한다.
- 예시: Optional<String> opt = Optional.of("Hello");
static <T> Optional<T> ofNullable(T value)
- 값이 null일 수도 있는 경우, Optional 객체를 생성한다. 값이 null이면 빈 Optional 객체를 반환한다.
- 예시: Optional<String> opt = Optional.ofNullable(null);
T get()
- 값이 존재하면 해당 값을 반환한다. 값이 존재하지 않으면 NoSuchElementException을 발생시킨다.
- 예시: String value = opt.get();
boolean isPresent()
- 값이 존재하면 true를, 존재하지 않으면 false를 반환한다.
- 예시: if (opt.isPresent()) { System.out.println("Value is present"); }
boolean isEmpty()
- 값이 존재하지 않으면 true를, 존재하면 false를 반환한다. (Java 11에서 추가된 메서드).
- 예시: if (opt.isEmpty()) { System.out.println("Value is empty"); }
void ifPresent(Consumer<? super T> action)
- 값이 존재하면 주어진 동작(Consumer)을 수행한다. 값이 없으면 아무 작업도 하지 않는다.
- 예시: opt.ifPresent(value -> System.out.println(value));
<U> Optional<U> map(Function<? super T, ? extends U> mapper)
- 값이 존재하면 주어진 함수에 값을 전달하고, 그 결과를 새로운 Optional로 감싼다.
값이 없으면 빈 Optional을 반환한다. - 예시: Optional<Integer> lengthOpt = opt.map(String::length);
<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
- map()과 유사하지만, 함수가 Optional을 반환하는 경우에 사용한다.
값이 존재하면 주어진 함수로 처리하고 그 결과를 반환하며, 값이 없으면 빈 Optional을 반환한다. - 예시: Optional<String> flatOpt = opt.flatMap(value -> Optional.of("Processed " + value));
Optional<T> filter(Predicate<? super T> predicate)
- 값이 존재하고 주어진 조건을 만족하면 해당 값을 포함한 Optional을 반환하고, 조건을 만족하지 않거나 값이 없으면 빈 Optional을 반환한다.
- 예시: Optional<String> filteredOpt = opt.filter(value -> value.length() > 3);
T orElse(T other)
- 값이 존재하면 그 값을 반환하고, 값이 없으면 주어진 대체 값을 반환한다.
- 예시: String result = opt.orElse("Default");
T orElseGet(Supplier<? extends T> other)
- 값이 존재하면 그 값을 반환하고, 값이 없으면 대체 값을 제공하는 함수(Supplier)를 실행하여 반환한다.
- 예시: String result = opt.orElseGet(() -> "Default");
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
- 값이 존재하면 그 값을 반환하고, 값이 없으면 주어진 예외를 발생시킨다.
- 예시: String result = opt.orElseThrow(() -> new IllegalArgumentException("Value not present"));
T orElseThrow()
- 값이 존재하면 그 값을 반환하고, 값이 없으면 NoSuchElementException을 발생시킨다. Java 10에서 추가되었다.
- 예시: String result = opt.orElseThrow();
map() vs flatMap()
map()은 Optional 안에 있는 값을 함수로 변환하는 데 사용되며, 해당 함수의 결과가 일반 값일 때 사용된다. 함수의 반환 값이 일반 객체일 경우, map()은 그 결과를 다시 Optional로 감싸서 반환한다.
예를 들어, map()에서 함수가 Optional<T>를 반환하면, 결과는 중첩된 Optional<Optional<U>> 형태가 된다.
Optional<String> opt = Optional.of("Hello");
// map() 사용 예시
Optional<Optional<String>> result = opt.map(value -> Optional.of("Processed " + value));
System.out.println(result); // Optional[Optional[Processed Hello]]
flatMap()은 함수가 Optional을 반환하는 경우 사용된다. flatMap()은 중첩된 Optional을 한 단계 풀어서 처리한다. 즉, 함수가 Optional<T>를 반환하면, 그 Optional을 중첩시키지 않고 하나의 Optional<U>로 반환한다.
Optional<String> opt = Optional.of("Hello");
// flatMap() 사용 예시
Optional<String> result = opt.flatMap(value -> Optional.of("Processed " + value));
System.out.println(result); // Optional[Processed Hello]
'Java > Java 유용한 클래스' 카테고리의 다른 글
Java 모니터 락(Monitor Lock) 제대로 이해하기 (0) | 2025.04.16 |
---|---|
Java에서 BufferedInputStream과 BufferedOutputStream의 동작 원리 정리 (0) | 2025.04.08 |
Java 유용한 클래스 (0) | 2024.10.01 |
Stream API - 부록 3 (2) | 2024.10.01 |
람다식(Lambda expression) - 부록2 (1) | 2024.09.13 |