PHpullh
학습 라이브러리/Java/Optional — Null 안전성

JAVA · 컬렉션

Optional — Null 안전성

Optional로 null을 명시적으로 처리하고 NPE를 방지합니다.

컬렉션중급OptionalorElseorElseGetmapflatMap

핵심 설명

Optional로 null을 명시적으로 처리하고 NPE를 방지합니다.

Java code

import java.util.Optional;

public class OptionalDemo {

    record User(String name, String email) {}
    record Address(String city) {}

    static Optional<User> findUser(int id) {
        if (id == 1) return Optional.of(new User("Alice", "alice@test.com"));
        if (id == 2) return Optional.of(new User("Bob", null));
        return Optional.empty();
    }

    static Optional<Address> getAddress(User user) {
        return user.name().equals("Alice")
            ? Optional.of(new Address("Seoul"))
            : Optional.empty();
    }

    public static void main(String[] args) {
        // 기본 사용
        Optional<User> opt = findUser(1);
        opt.ifPresent(u -> System.out.println("있음: " + u.name()));

        // orElse / orElseGet / orElseThrow
        User user = findUser(99)
            .orElse(new User("Guest", ""));
        User user2 = findUser(99)
            .orElseGet(() -> new User("Guest", ""));
        User user3 = findUser(1)
            .orElseThrow(() -> new RuntimeException("없음"));

        // map + flatMap — 체이닝
        String city = findUser(1)
            .flatMap(OptionalDemo::getAddress)
            .map(Address::city)
            .orElse("도시 모름");
        System.out.println("도시: " + city);

        // filter
        findUser(1)
            .filter(u -> u.email() != null)
            .ifPresent(u -> System.out.println("이메일: " + u.email()));

        // ifPresentOrElse (Java 9+)
        findUser(99).ifPresentOrElse(
            u  -> System.out.println("찾음: " + u.name()),
            () -> System.out.println("못 찾음")
        );

        // or (Java 9+) — 다른 Optional 제공
        Optional<User> result = findUser(99)
            .or(() -> findUser(1));
        System.out.println(result.map(User::name).orElse(""));
    }
}

학습 팁

Optional.orElse()는 항상 값을 생성합니다. 비용이 큰 기본값은 orElseGet()을 사용해 실제로 필요할 때만 생성되도록 하세요.

주의할 점

Optional을 인스턴스 필드, 컬렉션 원소, 메서드 파라미터로 사용하는 것은 안티패턴입니다. 반환 타입으로만 사용하는 것이 권장 사용법입니다.

자주 묻는 질문

Optional — Null 안전성란 무엇인가요?

Optional 로 null을 명시적으로 처리하고 NPE를 방지합니다.

Optional — Null 안전성 학습 시 주의할 점은 무엇인가요?

Optional을 인스턴스 필드, 컬렉션 원소, 메서드 파라미터로 사용하는 것은 안티패턴입니다. 반환 타입으로만 사용하는 것이 권장 사용법입니다.