프로그래밍언어/JAVA

[Java8] Optional 사용 방법과 예시

shoney9254 2024. 6. 12. 22:41
반응형

Java 8의 Optional 클래스와 관련된 다양한 메서드들을 정리하고, 각 메서드에 대한 예제를 작성해 보겠습니다.

1. Optional 만들기

  • Optional.of(): null이 아닌 값을 가지는 Optional을 생성합니다.
  • Optional.ofNullable(): 값이 null일 수 있는 Optional을 생성합니다.
  • Optional.empty(): 비어있는 Optional을 생성합니다.
Optional<String> optional1 = Optional.of("Hello"); // "Hello"를 포함하는 Optional 생성
Optional<String> optional2 = Optional.ofNullable(null); // null을 허용하는 Optional 생성
Optional<String> optional3 = Optional.empty(); // 비어있는 Optional 생성

2. Optional에 값이 있는지 없는지 확인하기

  • isPresent(): 값이 존재하는지 확인합니다.
  • isEmpty(): 값이 존재하지 않는지 확인합니다. (Java 11부터 제공)
Optional<String> optional = Optional.of("Hello");

if (optional.isPresent()) {
    System.out.println("Value is present");
}

if (optional.isEmpty()) { // Java 11부터 사용 가능
    System.out.println("Value is empty");
}

3. Optional에 있는 값 가져오기

  • get(): 값을 가져옵니다. 값이 없으면 NoSuchElementException을 던집니다.
Optional<String> optional = Optional.of("Hello");
String value = optional.get(); // "Hello" 반환

4. Optional에 값이 있는 경우에 그 값을 가지고 ~~를 하라

  • ifPresent(Consumer): 값이 존재하면 Consumer를 실행합니다.
Optional<String> optional = Optional.of("Spring Course");
optional.ifPresent(value -> {
    if (value.startsWith("Spring")) {
        System.out.println("Course ID: 123");
    }
});

5. Optional에 값이 있으면 가져오고 없는 경우에 ~~를 리턴하라

  • orElse(T): 값이 없으면 기본값을 리턴합니다.
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElse("Default Course"); // "Default Course" 반환

6. Optional에 값이 있으면 가져오고 없는 경우에 ~~를 하라

  • orElseGet(Supplier): 값이 없으면 Supplier를 실행하여 값을 리턴합니다.
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElseGet(() -> "Created New Course"); // "Created New Course" 반환

7. Optional에 값이 있으면 가져오고 없는 경우 에러를 던져라

  • orElseThrow(): 값이 없으면 예외를 던집니다.
Optional<String> optional = Optional.ofNullable(null);
String value = optional.orElseThrow(() -> new IllegalArgumentException("No value present"));

8. Optional에 들어있는 값 걸러내기

  • filter(Predicate): 값이 Predicate를 만족하면 값을 포함하는 Optional을 반환합니다.
Optional<String> optional = Optional.of("Spring Course");
optional.filter(value -> value.startsWith("Spring"))
        .ifPresent(System.out::println); // "Spring Course" 출력

9. Optional에 들어있는 값 변환하기

  • map(Function): 값을 변환하여 새로운 Optional을 반환합니다.
  • flatMap(Function): Optional 안에 들어있는 인스턴스가 Optional인 경우 사용합니다.
Optional<String> optional = Optional.of("Spring Course");

// map 사용 예
Optional<Integer> lengthOptional = optional.map(String::length);
lengthOptional.ifPresent(System.out::println); // 13 출력

// flatMap 사용 예
Optional<Optional<String>> nestedOptional = Optional.of(Optional.of("Nested Value"));
nestedOptional.flatMap(Function.identity())
              .ifPresent(System.out::println); // "Nested Value" 출력

종합 예제

다양한 Optional 메서드를 사용하는 예제 코드를 보여드리겠습니다.

import java.util.Optional;

public class OptionalExample {

    public static void main(String[] args) {
        // 1. Optional 만들기
        Optional<String> optional1 = Optional.of("Hello");
        Optional<String> optional2 = Optional.ofNullable(null);
        Optional<String> optional3 = Optional.empty();

        // 2. Optional에 값이 있는지 없는지 확인하기
        if (optional1.isPresent()) {
            System.out.println("Value is present: " + optional1.get());
        }
        if (optional3.isEmpty()) {
            System.out.println("Value is empty");
        }

        // 3. Optional에 있는 값 가져오기
        try {
            String value = optional2.get(); // NoSuchElementException 발생
        } catch (Exception e) {
            System.out.println("Caught exception: " + e);
        }

        // 4. Optional에 값이 있는 경우에 그 값을 가지고 ~~를 하라
        optional1.ifPresent(value -> System.out.println("Value is: " + value));

        // 5. Optional에 값이 있으면 가져오고 없는 경우에 ~~를 리턴하라
        String defaultValue = optional2.orElse("Default Value");
        System.out.println("Default value: " + defaultValue);

        // 6. Optional에 값이 있으면 가져오고 없는 경우에 ~~를 하라
        String orElseGetValue = optional2.orElseGet(() -> "Created New Value");
        System.out.println("OrElseGet value: " + orElseGetValue);

        // 7. Optional에 값이 있으면 가져오고 없는 경우 에러를 던져라
        try {
            String orElseThrowValue = optional2.orElseThrow(() -> new IllegalArgumentException("No value present"));
        } catch (Exception e) {
            System.out.println("Caught exception: " + e);
        }

        // 8. Optional에 들어있는 값 걸러내기
        Optional<String> filteredOptional = optional1.filter(value -> value.startsWith("H"));
        filteredOptional.ifPresent(value -> System.out.println("Filtered value: " + value));

        // 9. Optional에 들어있는 값 변환하기
        Optional<Integer> lengthOptional = optional1.map(String::length);
        lengthOptional.ifPresent(length -> System.out.println("Length: " + length));

        Optional<Optional<String>> nestedOptional = Optional.of(Optional.of("Nested Value"));
        nestedOptional.flatMap(Function.identity())
                      .ifPresent(nestedValue -> System.out.println("Nested value: " + nestedValue));
    }
}

이 예제는 다양한 Optional 메서드를 사용하는 방법을 보여줍니다. 각 메서드가 어떻게 동작하는지, 어떤 상황에서 사용해야 하는지 이해하는 데 도움이 될 것입니다.

반응형