[Java] Optional과 EMPTY

우노구나·2025년 7월 28일

Optional과 EMPTY 객체 개념은 자바에서 null 안전성과 객체 관리와 관련이 있다. 둘 다 기능이 비슷하나 자세히 보면 큰 차이가 있는데 요약하자면
Optional은 코드의 간결성에 강점이 있고
EMPTY 객체는 메모리 효율성에 강점이 있다.

Optional

Optional<T>는 값이 있을 수도 있고 없을 수도 있는 컨테이너 객체.
null 대신 안전하게 값의 유무를 표현하여 NullPointerException(NPE)을 방지.

  • Optional.of(value) : null이 아닌 값을 가진 Optional 생성.

  • Optional.ofNullable(value) : null이면 Optional.empty()를 반환.

  • Optional.empty() : 값이 없는 Optional 객체를 반환.

예시

Optional<String> opt = Optional.of("Hello");
Optional<String> emptyOpt = Optional.empty(); // 값이 없음

EMPTY 객체

null 대신 사용할 미리 정의된 "빈 객체"를 만들어 사용하는 패턴.

  • null 체크를 피하고 의미 있는 기본 동작을 제공.

  • Optional은 컨테이너지만, EMPTY 객체는 실제 객체다.

  • 객체가 null일 때 발생할 수 있는 예외를 방지.

예시

public class User {
    public static final User EMPTY = new User("", ""); // 빈 객체 상수
    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

// 사용 예시
User user = findUser().orElse(User.EMPTY); 

이 경우 null 대신 User.EMPTY를 반환하므로, null 체크 없이도 안전하게 사용 가능.

코드 간결성

Optional

  • map(), orElse(), orElseGet() 같은 메서드 체인을 활용하여 if-null 체크 없이 간결한 코드 작성 가능.
String name = userOpt.map(User::getName).orElse("Unknown");

EMPTY 객체

  • EMPTY를 직접 반환하지만, 값이 비었는지 확인하려면 isEmpty() 같은 직접 체크 로직이 필요할 수 있다.
if (user == User.EMPTY) { ... }

메모리 사용

Optional

  • Optional 객체가 한 번 더 생성됨. (값을 감싸는 컨테이너이기 때문)

EMPTY 객체

하나의 상수를 재사용하므로 메모리 효율이 높습니다.

public static final User EMPTY = new User("", "");

NPE 방지

Optional

  • orElse(), ifPresent() 등 안전한 메서드를 제공해 NPE를 예방할 수 있습니다.

EMPTY 객체

  • 빈 객체라도 실제 접근 시 null 체크는 개발자가 직접 해줘야 한다.
    예: user.getName() 호출 시 null이 아닌 빈 문자열을 반환하도록 설계해야 안전.

정리

특징OptionalEMPTY 객체
명시적 표현값이 없음을 Optional.empty()로 표현EMPTY 상수로 표현
코드 간결성메서드 체인을 활용한 간결한 처리isEmpty()로 직접 확인
메모리 사용Optional 객체 추가 생성 필요하나의 상수로 재사용 가능
NPE 방지안전한 Optional 메서드 제공개발자가 직접 체크해야 함

결론

Optional은 코드의 간결성에 강점이 있고
EMPTY 객체는 메모리 효율성에 강점이 있다.

profile
기술 블로그

0개의 댓글