개발스토리지😃

[Java] Optional<T> 메서드 본문

언어/자바

[Java] Optional<T> 메서드

believekim 2025. 4. 1. 18:08

 

Java 8부터 도입된 기능으로 NullPointerException(NPE) 방지 및
명시적인 값 존재 여부 표현을 위해 만들어졌습니다.

 

 

 

1. 등장 배경

  • 기존에는 null 값이 존재할 가능성이 있는 경우 아래와 같은 방식으로 코드를 작성
  • 이 문제를 해결하기 위해 Java 8에서는 null을 직접 다루지 않고 안전한 API로 값을 처리할 수 있는 Optional<T> 클래스를 도입
String value = getValue();
if (value != null) {
    System.out.println(value.length());
} else {
    System.out.println("값이 없습니다.");
}

 

 

2. Optional<T> 메서드

  •  생성 관련 메서드
메서드 설명
of(T value) null이 아닌 값을 포함하는 Optional 생성
ofNullable(T value) null일 수도 있는 값을 포함하는 Optional 생성
empty() 빈 Optional 객체 생성

 


  • 값 확인 및 존재 여부 관련 메서드
메서드 설명
isPresent() 값이 존재하는지 여부를 true/false로 반환
isEmpty() 값이 없는 경우 true 반환 (Java 11부터 추가됨)
ifPresent(Consumer<T> action) 값이 존재하면 해당 Consumer 실행
ifPresentOrElse(Consumer<T> action, Runnable emptyAction) 값이 있으면 Consumer 실행, 없으면 Runnable 실행 (Java 9부터 추가됨)

  • 값 반환 관련 메서드
메서드 설명
get() Optional 내부 값을 반환 (null이면 NoSuchElementException 발생)
orElse(T other) 값이 존재하면 해당 값을 반환, 없으면 other 반환
orElseGet(Supplier<? extends T> supplier) 값이 존재하면 반환, 없으면 Supplier 실행 후 반환
orElseThrow() 값이 존재하면 반환, 없으면 NoSuchElementException 발생
orElseThrow(Supplier<? extends Throwable> exceptionSupplier) 값이 없으면 지정한 예외 발생

  • 값 변환 및 필터링 관련 메서드
메서드 설명
map(Function<? super T, ? extends U> mapper) 값을 변환하여 새로운 Optional<U> 반환
flatMap(Function<? super T, Optional<U>> mapper) 중첩된 Optional을 평탄화 (Optional<Optional<T>> → Optional<T>)
filter(Predicate<? super T> predicate) 조건을 만족하는 값만 포함된 Optional 반환

  • 스트림 변환 관련 메서드 (Java 9부터)
메서드 설명
stream() 값이 존재하면 1개의 요소를 가진 스트림을 반환, 없으면 빈 스트림 반환

  • 비교 및 기타 메서드
메서드 설명
equals(Object obj) Optional 객체를 비교
hashCode() Optional 객체의 해시코드를 반환
toString() Optional의 값을 문자열로 변환

 

3. 주요 메서드 예시

  • Optional.ofNullable() + orElse()
// null이라면 "기본값" 출력
public class OptionalExample {
    public static void main(String[] args) {
        String name = null;
        String result = Optional.ofNullable(name).orElse("기본값");
        System.out.println(result);  // 출력: 기본값
    }
}

 

  • ifPresent()
// 값이 존재할 때만 실행
Optional<String> optional = Optional.of("Hello, Optional!");

optional.ifPresent(value -> System.out.println(value.toUpperCase()));
// 출력: HELLO, OPTIONAL!

 

  • map()
// map을 통한 값 변환
Optional<String> optional = Optional.of("Java");
Optional<Integer> length = optional.map(String::length);

System.out.println(length.orElse(0));  // 출력: 4

 

  • orElseThrow()
// 값이 없을 경우 IllegalStateException 발생
public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> optional = Optional.empty();
        
        String result = optional.orElseThrow(() -> new IllegalStateException("값이 없습니다!"));
        System.out.println(result);
    }
}

 

  • filter()
// 특정 조건에 해당하는 값만 출력
Optional<Integer> optionalAge = Optional.of(25);

optionalAge.filter(age -> age >= 18)
           .ifPresent(age -> System.out.println("성인입니다."));
// 출력: 성인입니다.

 

 

4. 주의점

1. Optional.get()을 사용할 경우 값이 없으면 NoSuchElementException이 발생하므로 orElse() 또는 orElseThrow()를 권장

2. Optional은 필드가 아닌 메서드의 반환값으로만 사용 (직렬화 및 성능 문제 발생)

3. orElse()는 항상 기본값을 생성, orElseGet()은 값이 없을 때만 실행되기에 orElseGet()이 더 효율적일 수 있음
String result = optional.orElse(getDefaultValue());  // 항상 getDefaultValue() 실행
String result = optional.orElseGet(() -> getDefaultValue());  // 값이 없을 때만 실행​

'언어 > 자바' 카테고리의 다른 글

[Java] == VS .equlas() (String & Wrapper 클래스 비교)  (0) 2025.07.16
[Java] 테스트코드 오류 수정 트러블슈팅  (0) 2025.04.21
[Java] Builder 패턴  (0) 2025.03.31
[Java] Stream 메서드  (0) 2025.03.27
[Java] Stack 메서드  (0) 2025.03.24