Back_End/JAVA

자바(Java) Optional 이란?

10Biliion 2025. 2. 14. 15:21

 

Optional은 Java 8에서 도입된 클래스(java.util.Optional)로, null을 직접 다루는 대신 안전하게 값을 처리할 수 있도록 도와주는 컨테이너 클래스입니다. Optional을 사용하면 NullPointerException(NPE) 발생 가능성을 줄이고, 코드의 가독성을 높일 수 있습니다.

2. Optional의 주요 메서드 및 사용 예제

2.1 Optional 객체 생성하기

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        // 값이 존재하는 Optional 생성
        Optional<String> optionalValue = Optional.of("Hello, Optional!");
        System.out.println(optionalValue.get()); // Hello, Optional!

        // null이 아닌 값이 있을 경우만 Optional 생성
        Optional<String> optionalNullable = Optional.ofNullable(null); // 비어있는 Optional
        System.out.println(optionalNullable.isPresent()); // false

        // 비어있는 Optional 생성
        Optional<String> emptyOptional = Optional.empty();
        System.out.println(emptyOptional.isPresent()); // false
    }
}

2.2 값이 존재하는지 확인

Optional<String> optional = Optional.ofNullable("Hello");
if (optional.isPresent()) {
    System.out.println(optional.get());
}

// orElse로 기본값 제공
String value = optional.orElse("Default Value");
System.out.println(value); // Hello

2.3 orElse, orElseGet, orElseThrow 비교

Optional<String> optionalEmpty = Optional.empty();

// 값이 없으면 기본값 반환
String result1 = optionalEmpty.orElse("기본값");
System.out.println(result1); // 기본값

// 값이 없을 때만 Supplier 실행 (성능 최적화)
String result2 = optionalEmpty.orElseGet(() -> "동적으로 생성된 값");
System.out.println(result2); // 동적으로 생성된 값

// 값이 없으면 예외 발생
try {
    String result3 = optionalEmpty.orElseThrow(() -> new RuntimeException("값이 없습니다!"));
} catch (Exception e) {
    System.out.println(e.getMessage()); // 값이 없습니다!
}

2.4 ifPresent와 ifPresentOrElse 사용

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

// 값이 있으면 실행
optional.ifPresent(value -> System.out.println("값: " + value)); // 값: Hello

// 값이 있으면 실행, 없으면 기본 동작 수행
optional.ifPresentOrElse(
    value -> System.out.println("값: " + value),
    () -> System.out.println("값이 없습니다")
);

2.5 Optional을 활용한 값 변환 (map, flatMap)

Optional<String> optional = Optional.of("Java Optional");

// map을 사용하여 값 변환
Optional<Integer> lengthOptional = optional.map(String::length);
System.out.println(lengthOptional.get()); // 13

// flatMap을 사용하여 중첩 Optional을 평탄화
Optional<Optional<String>> nestedOptional = Optional.of(Optional.of("Nested Value"));
Optional<String> flatMapped = nestedOptional.flatMap(opt -> opt);
System.out.println(flatMapped.get()); // Nested Value

2.6 filter를 사용하여 값 검증

Optional<String> optional = Optional.of("Hello");
Optional<String> filtered = optional.filter(value -> value.startsWith("H"));
System.out.println(filtered.isPresent()); // true

Optional<String> emptyFiltered = optional.filter(value -> value.startsWith("X"));
System.out.println(emptyFiltered.isPresent()); // false

3. Optional을 사용할 때 주의할 점

3.1 Optional을 반환할 때

  • Getter 메서드에서 Optional을 반환하는 것은 지양 (예외적으로 NULL을 다룰 때만 사용)
  • Optional을 매개변수로 받지 않도록 한다 (대부분 불필요함)

3.2 성능 고려

  • orElse()는 항상 실행되므로, 무거운 연산이 필요할 경우 orElseGet()을 사용해야 성능을 최적화할 수 있음

 

 

'Back_End > JAVA' 카테고리의 다른 글

자바(JAVA) DAO, DTO, VO 란?  (0) 2025.02.26
자바(JAVA) Synchronized  (0) 2025.02.24
얼리 리턴 패턴(Early Return Pattern) 이란?  (0) 2025.02.14
Java의 Comparator vs Comparable  (1) 2025.02.14
자바(Java) 스트림(Stream) 이란?  (1) 2025.02.13