Optional은 변수에 null이 아닌 값을 포함할 수도 있고 null일 수도 있는 상황을 처리하기 위한 클래스이다. Java 8에서 처음 도입되었고, 주로 NullPointerException을 방지하고, 코드의 가독성을 높이기 위해 사용된다.
Optional의 주요 메서드
- 값의 존재 여부 확인
- isPresent(): Optional 객체가 값을 가지고 있는지 여부를 확인
- ifPresent(Consumer): 값이 존재할 때 특정 동작을 수행
- 값 가져오기
- get(): 값이 존재하면 그 값을 반환하고, 값이 없으면 NoSuchElementException을 발생시킴
- orElse(T other): 값이 존재하면 그 값을 반환하고, 그렇지 않으면 기본 값을 반환
- orElseGet(Supplier<? extends T> other): 값이 존재하면 그 값을 반환하고, 그렇지 않으면 Supplier가 제공하는 값을 반환
- orElseThrow(Supplier<? extends X> exceptionSupplier): 값이 존재하면 그 값을 반환하고, 값이 없으면 주어진 예외를 발생시킴
- 값 변환
- map(Function<? super T, ? extends U> mapper): 값을 다른 형태로 변환합니다. Optional을 반환
- flatMap(Function<? super T, Optional<U>> mapper): 값을 변환한 후, Optional로 감싸지 않은 값을 반환
- 값 필터링
- filter(Predicate<? super T> predicate): 조건에 맞는 값만 남기고, 그렇지 않으면 빈 Optional을 반환
Optional 사용 예시
기본 사용 예시
Optional<String> optional = Optional.of("Hello, World!");
// 값이 존재하면 출력
optional.ifPresent(System.out::println);
// 값이 존재하면 그 값을 반환하고, 값이 없으면 "default" 반환
String value = optional.orElse("default");
System.out.println(value); // 출력: Hello, World!
// 값이 존재하면 변환, 그렇지 않으면 빈 Optional 반환
Optional<Integer> length = optional.map(String::length);
length.ifPresent(System.out::println); // 출력: 13
Null 처리 예시
String nullableString = null;
// null 값을 Optional로 감싸기
Optional<String> optional = Optional.ofNullable(nullableString);
// 값이 없으면 "default" 반환
String value = optional.orElse("default");
System.out.println(value); // 출력: default
복잡한 예외 처리 예시
Optional<String> optional = Optional.ofNullable(getNullableString());
String result = optional
.map(String::toUpperCase)
.orElseThrow(() -> new IllegalArgumentException("String is null"));
System.out.println(result);
Optional을 사용하는 이유
- NullPointerException 방지: Optional을 사용하면 명시적으로 값이 존재하지 않을 수 있음을 코드에서 나타낼 수 있어, NullPointerException을 방지할 수 있다.
- 가독성 향상: Optional을 통해 값이 존재할 때와 존재하지 않을 때의 처리를 명확하게 구분할 수 있어, 코드의 가독성이 향상된다.
- 함수형 프로그래밍 스타일 지원: Optional은 map, flatMap, filter 등 함수형 프로그래밍 스타일의 메서드를 제공하여, 더 선언적인 방식으로 코딩할 수 있게 한다.
Optional은 자바 프로그래밍에서 null 처리를 더욱 안전하고 우아하게 만들기 위한 강력한 도구지만, Optional을 남용하는 것은 피해야 하며, 필요할 때 적절히 사용하는 것이 좋다.
[참고] https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Optional.html Java SE 17 Optional 공식문서
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
예외 처리 (0) | 2024.02.05 |
---|---|
Static / Non-Static method (0) | 2024.01.29 |
Enum - 1 (feat. final) (0) | 2023.11.08 |
Stream (0) | 2023.11.04 |
Interface (0) | 2023.08.16 |