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을 인스턴스 필드, 컬렉션 원소, 메서드 파라미터로 사용하는 것은 안티패턴입니다. 반환 타입으로만 사용하는 것이 권장 사용법입니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.