Optional

박태현·2025년 5월 8일

Java

목록 보기
17/17

public final class Optional extends object

Java 8부터 도입된 래퍼 클래스로 값이 존재할 수도 있고, 존재하지 않을 수도 있는 상황을 처리하기 위해 사용됨

즉, null 처리를 위한 클래스

// Optional.of(value) → 값이 null이 아니어야 함
Optional<String> name = Optional.of("park");

// Optional.empty() → 값이 없음
Optional<String> emptyName = Optional.empty();

// Optional.ofNullable(value) → 값이 null일 수도 있음

기존에는 어느 값이 null일 수도 있기 때문에 따로 null 처리를 해줘야 했지만, Optional을 사용한다면 간편하게 NPE를 방지할 수 있음

// 기존의 null 처리 ( 번거로움 )
if (user != null && user.getName() != null) {
    return user.getName();
}

// Optional을 사용한 방식
return Optional.ofNullable(user)
               .map(User::getName)
               .orElse("이름 없음");

주의 사항

  • Optional을 엔티티나 DTO의 필드 타입으로 사용하는 것을 지양해야 함 Optional은 기본적으로 메서드의 반환값에서 사용하도록 설계된 클래스이며, 직렬화를 지원하지 않아 필드로 사용할 경우 예기치 않은 문제가 발생할 수 있고, 필드에 접근할 때마다 get()이나 orElse()와 같은 메서드를 호출해야 하므로 코드가 불필요하게 복잡해질 수 있습니다.
  • Optional 객체 생성 오버헤드 Optional은 기본 타입이 아닌 래퍼 객체이기 때문에, 단순히 값을 반환하는 대신 매번 Optional 인스턴스를 생성하게 되므로 불필요한 객체 생성 비용이 누적될 수 있으며, 이후 GC 부하를 증가시킬 수 있습니다. 또한, 값을 저장하거나 꺼낼 때마다 오토박싱/언박싱이 반복되어 성능 저하를 일으킬 수 있으므로, 불필요하게 남용하지 않아야 합니다

주요 메서드

isPresent()값이 존재하는지 확인if(opt.isPresent()) ...
get()값 꺼내기 ( 없으면 예외 발생 )opt.get()
orElse(T other)값이 없을 때 기본값 반환opt.orElse("기본값")
orElseGet(Supplier)기본값을 지연 생성opt.orElseGet(() -> "기본")
orElseThrow()값이 없으면 예외 던짐opt.orElseThrow()
map(Function)값이 있으면 함수 적용opt.map(String::toUpperCase)
flatMap(Function)중첩 Optional 처리opt.flatMap(User::getEmail)
profile
꾸준하게

0개의 댓글