자기개발/검색한 자료 정리

Java 8의 Optional 클래스를 활용한 안전한 null 처리 방법

실버블렛 2023. 4. 22. 07:00
반응형

요약: 이 글에서는 Java 8에서 도입된 Optional 클래스를 사용하여 null 값을 안전하게 처리하는 방법을 설명합니다. NullPointerException을 방지하고 코드의 가독성을 높일 수 있는 Optional 클래스의 사용법을 알아봅시다.

Optional 클래스란?

Java 8에서 도입된 Optional 클래스는 null 값에 대한 대안을 제공하여 NullPointerException을 방지하고자 만들어진 wrapper 클래스입니다. Optional 클래스는 값을 포장하며, 값이 있을 수도 있고 없을 수도 있음을 명시적으로 표현할 수 있습니다.

Optional 객체 생성하기

Optional 객체는 다음과 같은 세 가지 방법으로 생성할 수 있습니다.

  1. Optional.empty(): 빈 Optional 객체를 생성합니다.
  2. Optional.of(T value): value를 포함하는 Optional 객체를 생성합니다. value가 null이면 NullPointerException을 발생시킵니다.
  3. Optional.ofNullable(T value): value가 null일 경우 빈 Optional 객체를 생성하고, 그렇지 않으면 value를 포함하는 Optional 객체를 생성합니다.
Optional<String> emptyOptional = Optional.empty();
Optional<String> nonEmptyOptional = Optional.of("Hello, World!");
Optional<String> nullableOptional = Optional.ofNullable(null);

Optional 값 가져오기

Optional 객체에 포함된 값을 가져오려면 다음 메소드를 사용할 수 있습니다.

  1. get(): Optional 객체에 저장된 값을 반환합니다. 값이 존재하지 않으면 NoSuchElementException을 발생시킵니다.
  2. orElse(T other): 값이 존재하면 해당 값을 반환하고, 값이 없으면 other 값을 반환합니다.
  3. orElseGet(Supplier<? extends T> other): 값이 존재하면 해당 값을 반환하고, 값이 없으면 other를 호출하여 반환값을 가져옵니다.
Optional<String> optional = Optional.of("Hello, World!");
System.out.println(optional.get()); // Hello, World!

Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse("Default Value")); // Default Value
System.out.println(emptyOptional.orElseGet(() -> "Default Value from Supplier")); // Default Value from Supplier

Optional 값 확인하기

Optional 객체의 값이 존재하는지 확인하려면 isPresent()와 isEmpty() 메소드를 사용할 수 있습니다.

Optional<String> optional = Optional.of("Hello, World!");
System.out.println(optional.isPresent()); // true

Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.isEmpty()); // true

Optional 값 처리하기

Optional 객체를 사용하여 값이 존재할 경우 작업을 수행하거나, 값이 없을 경우 기본 동작을 정의할 수 있습니다.

  1. ifPresent(Consumer<? super T> action): 값이 존재하면 action을 수행합니다.
  2. ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction): 값이 존재하면 action을 수행하고, 값이 없으면 emptyAction을 수행합니다.
Optional < String > optional = Optional.of("Hello, World!");
optional.ifPresent(System.out::println); // Hello, World!

Optional < String > emptyOptional = Optional.empty();
emptyOptional.ifPresentOrElse(
    System.out::println,
    () - > System.out.println("Value not present") // Value not present
);

Optional 객체를 사용한 연산

map(), flatMap(), filter() 등의 메소드를 사용하여 Optional 객체에 연산을 수행할 수 있습니다.

Optional<String> optional = Optional.of("Hello, World!");

Optional<Integer> lengthOptional = optional.map(String::length);
System.out.println(lengthOptional.orElse(-1)); // 13

Optional<Integer> emptyOptional = Optional.<String>empty().map(String::length);
System.out.println(emptyOptional.orElse(-1)); // -1

Optional<String> filteredOptional = optional.filter(s -> s.startsWith("Hello"));
System.out.println(filteredOptional.orElse("Not Found")); // Hello, World!

예제: 사용자 이름 가져오기

다음 예제에서는 사용자 객체가 null이거나 사용자 이름이 null일 경우 기본 값을 반환하는 메소드를 Optional 클래스를 사용하여 구현합니다.

class User {
    private String name;

    User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

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

User user = new User("John Doe");
System.out.println(getUserName(user)); // John Doe

User nullUser = null;
System.out.println(getUserName(nullUser)); // Unknown User

Java 8의 Optional 클래스를 활용하면 null 값 처리를 안전하게 하면서 코드의 가독성을 향상시킬 수 있습니다.
NullPointerException을 방지하고, null 처리 로직을 명확하게 표현하여 프로젝트의 품질을 높이세요.

반응형