Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9에서 Optional 클래스에 추가된 새로운 메소드 3가지 완벽 정리

Optional 클래스는 null이 아닌(non-null) 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너 역할을 합니다. 이 클래스는 Java 8에서 처음 도입되었으며, 코드 전반에서 NullPointerException이 발생할 수 있는 지점을 줄이는 것이 목적입니다.

Java 9에서는 Optional 클래스에 or(), ifPresentOrElse(), stream()이라는 세 가지 새로운 메소드가 추가되어, 기본값(default value)을 더욱 효율적으로 다룰 수 있게 되었습니다. 각 메소드의 특징과 사용 예제를 살펴보겠습니다.

1. Optional.or()

or() 메소드는 Java 9에서 도입되었으며, 함수형 인터페이스인 Supplier를 매개변수로 받습니다. 이 메소드는 항상 비어있지 않은 Optional 객체를 반환합니다. 만약 원본 Optional 객체에 값이 존재하면 그 객체 자체를 그대로 반환하고, 값이 없다면 Supplier가 생성한 대체 Optional 객체를 반환합니다.

예제

import java.io.IOException;
import java.util.Optional;

public class OptionalOrMethodTest {
   public static void main(String[] args) throws IOException {
      String str = null;
      Optional<String> opt = Optional.ofNullable(str);
      Optional<String> result = opt.or(() -> Optional.of("Adithya"));
      System.out.println(result);
   }
}

실행 결과

Optional[Adithya]

위 예제에서 str이 null이므로 or() 메소드는 Supplier가 제공한 "Adithya"라는 값을 가진 Optional 객체를 반환합니다.

2. Optional.ifPresentOrElse()

ifPresentOrElse() 메소드 역시 Java 9에서 추가되었습니다. 기존의 ifPresent() 메소드와 유사하지만, 한 가지 차이점은 값이 없을 때 실행할 Runnable 매개변수가 하나 더 추가되었다는 점입니다. 즉, Optional 객체에 값이 있으면 해당 값을 소비하는 동작을 수행하고, 값이 비어있다면 Runnable 객체에 정의된 동작을 실행합니다.

예제

import java.util.Optional;

public class OptionalIfPresentOrElseTest {
   public static void main(String[] args) {
      String str = null;
      Optional<String> opt = Optional.ofNullable(str);
      opt.ifPresentOrElse(
         x -> System.out.println(x),
         () -> System.out.println("No value"));
   }
}

실행 결과

No value

str이 null이기 때문에 첫 번째 람다식(값 출력)은 실행되지 않고, 두 번째 Runnable인 "No value" 출력문이 실행됩니다.

3. Optional.stream()

stream() 메소드는 Java 9부터 지원되며, Optional 객체로부터 새로운 Stream 객체를 생성할 수 있습니다. Optional 객체에 값이 존재하면 그 값을 담고 있는 스트림을 반환하고, 값이 없으면 빈 스트림(empty stream)을 반환합니다. 특히 여러 개의 Optional을 다루는 컬렉션에서 flatMap과 함께 사용하면 빈 Optional을 손쉽게 걸러낼 수 있습니다.

예제

import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public class OptionalStreamMethodTest {
   public static void main(String[] args) throws IOException {
      List<Optional<String>> list = List.of(
         Optional.of("Jai"),
         Optional.empty(),
         Optional.of("Adithya"));
      Stream<String> stream = list.stream().flatMap(Optional::stream);
      stream.forEach(System.out::println);
   }
}

실행 결과

Jai
Adithya

리스트에는 세 개의 Optional이 있지만, 그중 하나는 empty()로 생성된 빈 Optional입니다. stream() 메소드를 flatMap과 함께 사용하면 빈 Optional은 자동으로 제외되고, 값이 있는 "Jai"와 "Adithya"만 출력됩니다.

정리

Java 9에서 추가된 이 세 가지 메소드는 각각 다음과 같은 상황에서 유용하게 활용됩니다.

  • or(): 값이 없을 때 대체 Optional을 제공하여 기본값 처리
  • ifPresentOrElse(): 값의 유무에 따라 서로 다른 동작을 한 번에 분기 처리
  • stream(): Optional을 스트림 파이프라인에 자연스럽게 통합

이 메소드들을 활용하면 null 검사 코드를 크게 줄이고, 더 선언적이고 안전한 코드를 작성할 수 있습니다.