본문 바로가기
Java

[Java] Optional

by NJ94 2023. 11. 16.

Optional

 

Java v17 Docs - Optional

 

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Optional.html

 

Optional (Java SE 17 & JDK 17)

Type Parameters: T - the type of value public final class Optional extends Object A container object which may or may not contain a non-null value. If a value is present, isPresent() returns true. If no value is present, the object is considered empty and

docs.oracle.com

 

Optional


Optional은 Java8에서 도입된 클래스로, 값의 존재 여부를 나타내는 컨테이너 객체이다. 이 클래스는 주로 값이 존재하지 않을 수 있는 상황에서 NullPointerException 을 방지하고자 할 때 사용된다.

 

 

값이 존재 여부 표현


Optional 은 값이 존재할 수도 있고, 존재하지 않을 수도 있는 상황을 다룬다

 

 

Null 대신 사용


기존에는 메서드가 null을 반환하는 경우, 이로 인해 NullPointerException이 발생할 수 있었다. Optional을 사용하면 이를 방지하고 null을 직접 다루지 않아도 된다.

 

 

메서드 체이닝


Optional 은 메서드 체이닝을 지원하며, 여러 메서드를 연속적으로 호출하여 안전하게 값에 접근하고 변환할 수 있다.

 

 

메서드


  • of(T value): 주어진 값을 가지는 Optional 객체를 생성합니다. 이 때, 값이 null이 아니어야 합니다.
  • ofNullable(T value): 주어진 값이 null이 아닌 경우 해당 값을 가지는 Optional 객체를 생성합니다. 값이 null인 경우 빈 Optional을 반환합니다.
  • empty(): 빈 Optional 객체를 반환합니다.
  • isPresent(): 값이 존재하는지 여부를 확인합니다. 값이 존재하면 true, 그렇지 않으면 false를 반환합니다.
  • ifPresent(Consumer<? super T> consumer): 값이 존재하는 경우에만 주어진 동작(Consumer)을 수행합니다.
  • orElse(T other): 값이 존재하지 않는 경우에 대체 값을 반환합니다.
  • orElseGet(Supplier<? extends T> other): 값이 존재하지 않는 경우, 값을 생성하는 Supplier를 통해 값을 얻습니다.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): 값이 존재하지 않는 경우, 예외를 던집니다.

 

예시


Optional<String> optionalString = Optional.of("Hello");

// 값이 존재하는지 확인
if (optionalString.isPresent()) {
    System.out.println("값이 있습니다: " + optionalString.get());
}

// 값이 존재할 경우 동작 수행
optionalString.ifPresent(value -> System.out.println("값: " + value));

// 값이 존재하지 않는 경우 대체 값을 반환
String result = optionalString.orElse("기본값");

// 값이 존재하지 않는 경우 예외 던지기
String value = optionalString.orElseThrow(() -> new IllegalArgumentException("값이 없습니다"));

 

'Java' 카테고리의 다른 글

[Java] LinkedHashMap  (0) 2023.12.24
[Java] Map 자세히 알아보기  (0) 2023.11.16
[Java] 배열(Array) vs 리스트(List) 차이.  (0) 2023.11.09