Optional<T>
Optional<T>는 값이 있을 수도 있고, 없을 수도 있는 상황을 표현하는 타입
null로 인한 (NPE)를 안전하게 처리 위해 제공되는 래퍼 클래스
- 실제 객체를 포장하는 상자에 비유
Optional 생성 방법
Optional.empty(): 빈 Optional 객체 생성
Optional.of(value): 값이 있는 Optional 객체를 생성(만약 value가 null이면 NPE 발생)
Optional.ofNullable(value): value가 null일 수도 아닐 수도 있을 때 사용, null이면 빈 Optional을 반환
Optional<String> empty = Optional.empty();
Optional<String> name = Optional.of("의연");
Opitonal<String> unknown = Optional.ofNull(null);
Optional 처리 방법
값 확인
isPresent(): Optional 내부에 값이 있으면 true, 없으면 false를 반환
isEmpty(): Optional 내부에 값이 없으면 true, 있으면 false를 반환
if (optional.isPresent()) {
System.out.println(optional.get());
}
if (optional.isEmpty()) {
System.out.println(optional.get());
}
값 꺼내기
get(): Optional 내부의 값을 반환, 없으면 NoSuchElementException 발생
orElse(value): Optional 내부에 값이 있으면 반환하고, 없으면 전달한 value를 반환
orElseGet(...): Optional 내부에 값이 있으면 반환하고, 없으면 전달한 함수를 실행하여 그 결과를 반환
orElseThrow(...): Optional 내부에 값이 있으면 반환하고, 없으면 지정한 예외를 발생
- Spring Data JPA의
findById()는 Optional을 반환
String name = optional.get();
String name = optional.orElse("Guest");
String name = optional.orElseGet(() -> "Guest");
User user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다."));
값 처리
ifPresent(...): Optional 내부에 값이 있을 때만 전달한 동작을 실행
optional.ifPresent(name -> {
System.out.println(name);
});