자바의 Optional<T> 클래스는 Java8 부터 도입되어, "null"이 될 수 있는 객체를 감싸는 래퍼(wrapper) 클래스 입니다. Optional을 사용하면 NullPointException이 발생할 수 있는 상황을 명시적으로 회피하고, 코드의 가독성을 높일 수 있습니다. Optional은 값이 있거나 없을 수 있는 값을 나타내며, 값이 없는 경우를 더 안전하게 처리할 수 잇는 다양한 메서드를 제공합니다.
주요 메서드
- Optional.of(T value) : null이 아닌 값을 갖는 Optional 객체를 생성합니다. null이면 NullPointException을 던집니다.
- Optional.ofNullalble(T value) : 값이 null일 수 있는 경우에 사용하며, 값이 null 이면 빈 Optional을 반환합니다.
- Optional.empty()
- Optional.empty() : 값이 없는 빈 Optional을 반환합니다.
- Optional.isPresent() : 값이 존재하면 true, 그렇지 않으면 false를 반환합니다.
- Optional.ifPresent(Consumber<? super T> consumer) : 값이 존재하면 주어진 액션을 실행합니다.
- Optional.get() : 값이 존재하면 반환하고, 값이 없으면 NoSuchElementException을 던집니다.
- Optional.orElse(T other) : 값이 존재하면 반환하고 값이 없으면 기본값을 반환합니다.
- 각체가 값을 포함하지 않을 때 반환할 기본 값을 직접 지정합니다. 이 메소드는 Optional 객체의 값이 있든 없는 항상 기본값을 생성합니다. 따라서 기본값의 생성 비용이 높거나 복잡한 계산을 요구하는 경우 불필요한 성능저하를 야기할 수 있습니다.
- Optional.orElseGet(Supplier<? extends T> other) : 값이 존재하면 값을 반환하고 값이 없으면 Supplier을 통해 생성된 값을 반환합니다.
- Optional 객치가 비어 있을 때 Supplier를 통해 제공된 대체 값을 계산하고 반환합니다. 즉, 값이 있을 경우네는 Supplier의 코드가 실행되지 않으므로 OrElse 보다 효율적으로 사용될 수 있습니다.
- Optional.orElseThrow(Supplier<? extends X>) : 값이 존재하면 반환하고, 없으면 주어진 예외를 던집니다.
사용 예시
public class OptionalExam {
public static void main(String[] args) {
// 사용자 정보 조회
Optional<User> userOptional = findUserById(1L);
// ifPresent() : 값이 존재하면 실행
userOptional.ifPresent(user -> {
System.out.println("user1 = " + user);
});
// orElse() : 값이 존재하지 않으면 기본값 반환
User user = userOptional.orElse(new User());
System.out.println("user2 = " + user);
// orElseGet() : 값이 존재하지 않으면 람다식 실행
User user2 = userOptional.orElseGet(() -> new User());
System.out.println("user3 = " + user2);
// orElseThrow() : 값이 존재하지 않으면 예외 발생
User user3 = userOptional.orElseThrow(() -> new RuntimeException("사용자 정보가 없습니다."));
// ifPresentOrElse() : 값이 존재하면 실행, 값이 존재하지 않으면 람다식 실행
findUserById(1l).ifPresentOrElse(user1 ->
System.out.println("user1 = " + user1),
() -> System.out.println("사용자 정보가 없습니다."));
}
public static Optional<User> findUserById(Long id) {
User userOptional = User.builder().id(1L).name("John").email("test@email.com").build();
return Optional.ofNullable(null);
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
static class User {
private Long id;
private String name;
private String email;
}
}
'자바' 카테고리의 다른 글
자바에서 동일성, 동등성 비교하기 (1) | 2024.04.03 |
---|---|
Parallel Stream (1) | 2024.02.06 |
Stream API (0) | 2024.02.02 |
Lamda Method Reference (0) | 2024.01.31 |
Java Lamda 표현식과 Stream API (1) | 2024.01.31 |