Java를 배워보자/8. 자바 8 이상의 새로운 기능

자바 Optional 클래스 (8 이상)

_Blue_Sky_ 2024. 9. 27. 12:56
728x90
728x90

자바 Optional 클래스: null 처리의 새로운 패러다임

자바 8에서 도입된 Optional 클래스는 null 포인터 예외(NullPointerException)를 방지하고 코드의 가독성을 향상시키는 데 크게 기여했습니다. 이 글에서는 Optional 클래스의 개념, 사용법, 그리고 다양한 활용 사례를 자세히 살펴보도록 하겠습니다.

Optional 클래스란 무엇인가?

Optional 클래스는 값이 존재할 수도 있고, 존재하지 않을 수도 있는 상황을 표현하는 컨테이너입니다. 즉, 값이 있으면 그 값을 담고, 값이 없으면 empty Optional을 반환합니다. 이를 통해 null을 직접 사용하는 대신 Optional을 사용하여 null 체크 로직을 명확하게 표현할 수 있습니다.

왜 Optional 클래스를 사용해야 할까?

  • NullPointerException 방지: Optional을 사용하면 null 값을 직접 다루지 않기 때문에 NullPointerException 발생 가능성을 줄일 수 있습니다.
  • 코드 가독성 향상: Optional의 메소드들은 값이 존재하는 경우에만 동작하도록 설계되어 있어 코드의 의도를 명확하게 드러냅니다.
  • 함수형 프로그래밍 지원: Optional은 함수형 프로그래밍 스타일과 잘 어울리며, 스트림 API와 함께 사용하여 데이터 처리를 더욱 간결하게 만들 수 있습니다.

Optional 클래스 사용법

  • 생성:
    • Optional.of(value): 값이 존재하는 경우 Optional 객체 생성
    • Optional.empty(): 값이 없는 경우 Optional 객체 생성
    • Optional.ofNullable(value): 값이 null인 경우 empty Optional, 그렇지 않으면 Optional 객체 생성
  • 값 추출:
    • isPresent(): 값이 존재하는지 여부 확인
    • get(): 값이 존재하는 경우 값 반환 (값이 없으면 NoSuchElementException 발생)
    • orElse(defaultValue): 값이 존재하지 않으면 기본값 반환
    • orElseGet(supplier): 값이 존재하지 않으면 Supplier를 사용하여 값 생성
    • orElseThrow(supplier): 값이 존재하지 않으면 예외 발생
  • 매핑:
    • map(mapper): 값이 존재하는 경우 함수를 적용하여 새로운 Optional 객체 생성
    • flatMap(mapper): 값이 존재하는 경우 Optional을 반환하는 함수를 적용
  • 필터링:
    • filter(predicate): 조건에 맞는 값만 남기고 Optional 객체 생성

Optional 클래스 활용 사례

  • 메서드 반환 값: 메서드에서 값이 없을 수 있는 경우 Optional을 반환하여 호출하는 쪽에서 null 체크를 하지 않도록 할 수 있습니다.
  • 데이터베이스 조회 결과: 데이터베이스에서 조회한 결과가 없을 수 있는 경우 Optional을 사용하여 null 체크 로직을 간소화할 수 있습니다.
  • 옵셔널 파라미터: 메서드의 파라미터가 선택적인 경우 Optional을 사용하여 null 체크를 생략할 수 있습니다.
  • 스트림 API와 함께 사용: 스트림 API의 map, flatMap, filter 등의 메서드와 함께 사용하여 데이터 처리를 더욱 유연하게 할 수 있습니다.

Optional 클래스 주의사항

  • 중첩된 Optional: Optional 내부에 또 다른 Optional을 사용하는 것은 코드 가독성을 저하시킬 수 있으므로 주의해야 합니다.
  • Optional의 남용: 모든 값을 Optional로 감싸는 것은 오히려 코드를 복잡하게 만들 수 있습니다. 적절한 상황에서 사용해야 합니다.
728x90

 

Optional 클래스 사용법

1. Optional 객체 생성

Optional<String> optionalString = Optional.of("Hello"); // 값이 있는 경우
Optional<String> emptyOptional = Optional.empty(); // 값이 없는 경우
Optional<String> optionalNull = Optional.ofNullable(null); // null 값을 감싸는 경우
 
  • of(T value): 값이 존재하는 경우 Optional 객체를 생성합니다.
  • empty(): 값이 없는 경우 Optional 객체를 생성합니다.
  • ofNullable(T value): 값이 null인 경우에도 Optional 객체를 생성하며, 내부에 null 값을 저장합니다.

2. 값 추출

String value = optionalString.get(); // 값이 있는 경우 값을 반환, 없으면 NoSuchElementException 발생
 
  • get(): 값이 존재하는 경우 값을 반환하지만, 값이 없으면 NoSuchElementException을 발생시킵니다. 따라서 값이 존재하는지 반드시 확인하고 사용해야 합니다.

3. 값이 존재하는지 확인

boolean isPresent = optionalString.isPresent(); // 값이 존재하는지 확인
 
  • isPresent(): 값이 존재하면 true, 아니면 false를 반환합니다.

4. 기본값 설정

String defaultValue = optionalString.orElse("World"); // 값이 없으면 기본값을 반환
 
  • orElse(T other): 값이 없으면 다른 값을 반환합니다.
  • orElseGet(Supplier<? extends T> other): 값이 없으면 Supplier를 이용하여 값을 생성하여 반환합니다.

5. 예외 처리

optionalString.orElseThrow(NoSuchElementException::new); // 값이 없으면 예외 발생
 
  • orElseThrow(Supplier<? extends X> exceptionSupplier): 값이 없으면 주어진 Supplier를 이용하여 예외를 생성하고 발생시킵니다.

6. Optional 값을 이용한 연산

optionalString.map(String::toUpperCase).orElse("EMPTY"); // 값이 있으면 대문자로 변환, 없으면 EMPTY 반환
 
  • map(Function<? super T, ? extends U> mapper): 값이 있으면 주어진 함수를 적용한 결과를 반환합니다.
  • flatMap(Function<? super T, Optional<U>> mapper): 값이 있으면 주어진 함수를 적용하고 결과가 또 다른 Optional 객체인 경우 이를 평탄화합니다.

실제 예시

public class OptionalExample {
    public String getName(User user) {
        return Optional.ofNullable(user)
                .map(User::getName)
                .orElse("Unknown");
    }
}
 

위 코드는 User 객체가 null일 경우 "Unknown"을 반환하고, 유효한 User 객체인 경우 이름을 반환합니다.

결론

Optional 클래스는 자바 개발에서 null 처리를 더욱 안전하고 명확하게 만들어주는 중요한 기능입니다. Optional을 적절하게 사용하면 코드의 품질을 향상시키고 NullPointerException으로 인한 문제를 예방할 수 있습니다.

 

728x90
728x90