프로그래밍언어/JAVA

[Java8] Optional을 사용할 때 주의해야 할 사항과 관련된 예제 소스

shoney9254 2024. 6. 12. 22:35
반응형

Java 8에서 Optional을 사용할 때 주의해야 할 사항과 관련된 예제 소스

1. 리턴값으로만 쓰기를 권장한다

메소드의 매개변수 타입, 맵의 키 타입, 인스턴스 필드 타입으로 사용하지 않는 것이 좋습니다.

// 권장되지 않는 사용 예
public void process(Optional<String> input) {
    // ...
}

// 권장되는 사용 예
public Optional<String> process() {
    // ...
}

2. Optional을 리턴하는 메소드에서 null을 리턴하지 말자

Optional을 반환하는 메소드에서는 절대로 null을 반환하지 않도록 합니다.

// 잘못된 사용 예
public Optional<String> getValue() {
    return null; // 절대 이렇게 하지 말 것
}

// 올바른 사용 예
public Optional<String> getValue() {
    return Optional.ofNullable(null); // null일 경우 빈 Optional을 반환
}

3. 프리미티브 타입용 Optional이 따로 있다

프리미티브 타입을 위한 OptionalInt, OptionalLong 등을 사용합니다. (성능, 명확한 의도 표현)

// Optional 사용 예
public OptionalInt getOptionalInt() {
    int value = ...;
    return (value != -1) ? OptionalInt.of(value) : OptionalInt.empty();
}

  • OptionalInt, OptionalLong, ...

4. Collection, Map, Stream, Array, Optional을 Optional로 감싸지 말 것

Collection, Map, Stream, Array, Optional 타입을 다시 Optional로 감싸지 않도록 합니다.

// 잘못된 사용 예
public Optional<Optional<String>> getOptionalValue() {
    Optional<String> value = Optional.of("test");
    return Optional.of(value); // 이런 중첩은 피할 것
}

// 올바른 사용 예
public Optional<String> getOptionalValue() {
    return Optional.of("test");
}

종합 예제

위의 주의사항을 종합하여 하나의 클래스 예제로 보여드리겠습니다.

import java.util.Optional;
import java.util.OptionalInt;

public class OptionalExample {

    // 리턴값으로만 Optional 사용
    public Optional<String> findValue() {
        String value = null; // 비어있을 수 있는 값
        return Optional.ofNullable(value);
    }

    // null을 리턴하지 말고 Optional.empty() 사용
    public Optional<String> getValue() {
        String value = null;
        return (value != null) ? Optional.of(value) : Optional.empty();
    }

    // 프리미티브 타입용 Optional 사용
    public OptionalInt findOptionalInt() {
        int value = -1; // 기본값
        return (value != -1) ? OptionalInt.of(value) : OptionalInt.empty();
    }

    // Collection, Map, Stream, Array, Optional 타입을 Optional로 감싸지 말 것
    public Optional<String> getNestedOptional() {
        return Optional.of("test");
    }

    public static void main(String[] args) {
        OptionalExample example = new OptionalExample();

        // findValue 메서드 사용
        example.findValue().ifPresent(System.out::println);

        // getValue 메서드 사용
        example.getValue().ifPresent(System.out::println);

        // findOptionalInt 메서드 사용
        example.findOptionalInt().ifPresent(System.out::println);

        // getNestedOptional 메서드 사용
        example.getNestedOptional().ifPresent(System.out::println);
    }
}

이 예제 코드는 Optional을 올바르게 사용하는 방법을 보여줍니다. 메서드는 Optional을 리턴하지만, 메서드 매개변수나 클래스 필드로는 사용하지 않습니다. 또한 Optional을 리턴할 때 null을 리턴하지 않고, 프리미티브 타입용 Optional을 사용하며, 중첩 Optional을 사용하지 않습니다.

반응형