Java 8 Optional 마스터하기: 널-안전 코드를 위한 실용 가이드
Optional은 null이 아닌 객체를 담는 컨테이너 객체입니다. Optional 객체는 값이 없을 때 null을 표현하는 데 사용됩니다. 이 클래스는 값을 '사용 가능' 또는 '사용 불가'로 처리할 수 있는 다양한 유틸리티 메서드를 제공하여, 직접 null을 확인하는 대신 안전하게 다룰 수 있게 해줍니다. Java 8에 도입되었으며, Guava의 Optional과 유사합니다.
클래스 선언
다음은 java.util.Optional<T> 클래스의 선언입니다.
public final class Optional<T> extends Object
클래스 메서드
| 번호 |
메서드 및 설명 |
| 1 |
static <T> Optional<T> empty()
빈 Optional 인스턴스를 반환합니다. |
| 2 |
boolean equals(Object obj)
다른 객체가 이 Optional과 "같은지" 여부를 나타냅니다. |
| 3 |
Optional<T> filter(Predicate<? super T> predicate)
값이 존재하고 주어진 프레디케이트와 일치하면 해당 값을 설명하는 Optional을 반환하고, 그렇지 않으면 빈 Optional을 반환합니다. |
| 4 |
<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
값이 존재하면 제공된 Optional을 반환하는 매핑 함수를 적용하여 그 결과를 반환하고, 그렇지 않으면 빈 Optional을 반환합니다. |
| 5 |
T get()
이 Optional에 값이 있으면 해당 값을 반환하고, 없으면 NoSuchElementException을 던집니다. |
| 6 |
int hashCode()
값이 있으면 해당 값의 해시 코드를 반환하고, 없으면 0을 반환합니다. |
| 7 |
void ifPresent(Consumer<? super T> consumer)
값이 존재하면 지정된 소비자(consumer)를 값과 함께 호출하고, 그렇지 않으면 아무 작업도 하지 않습니다. |
| 8 |
boolean isPresent()
값이 있으면 true를 반환하고, 없으면 false를 반환합니다. |
| 9 |
<U> Optional<U> map(Function<? super T, ? extends U> mapper)
값이 존재하면 제공된 매핑 함수를 적용하고, 결과가 null이 아니면 그 결과를 설명하는 Optional을 반환합니다. |
| 10 |
static <T> Optional<T> of(T value)
지정된 null이 아닌 값이 존재하는 Optional을 반환합니다. |
| 11 |
static <T> Optional<T> ofNullable(T value)
지정된 값이 null이 아니면 해당 값을 설명하는 Optional을 반환하고, null이면 빈 Optional을 반환합니다. |
| 12 |
T orElse(T other)
값이 있으면 해당 값을 반환하고, 없으면 other를 반환합니다. |
| 13 |
T orElseGet(Supplier<? extends T> other)
값이 있으면 해당 값을 반환하고, 없으면 other를 호출하여 그 결과를 반환합니다. |
| 14 |
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
값이 있으면 해당 값을 반환하고, 없으면 제공된 공급자(supplier)가 생성하는 예외를 던집니다. |
| 15 |
String toString()
디버깅에 적합한 이 Optional의 비어 있지 않은 문자열 표현을 반환합니다. |
이 클래스는 다음 클래스에서 메서드를 상속받습니다.
Optional 예제
원하는 편집기를 사용하여 다음 Java 프로그램을 작성하세요. (예: C:\> JAVA)
Java8Tester.java
Live Demo
import java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - 전달된 매개변수가 null일 수 있음
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - 전달된 매개변수가 null이면 NullPointerException 발생
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Optional.isPresent - 값이 존재하는지 확인
System.out.println("첫 번째 매개변수 존재 여부: " + a.isPresent());
System.out.println("두 번째 매개변수 존재 여부: " + b.isPresent());
// Optional.orElse - 값이 있으면 반환, 없으면 기본값 반환
Integer value1 = a.orElse(new Integer(0));
// Optional.get - 값 가져오기, 값이 있어야 함
Integer value2 = b.get();
return value1 + value2;
}
}
결과 확인
javac 컴파일러를 사용하여 클래스를 컴파일하세요.
C:\JAVA>javac Java8Tester.java
다음과 같이 Java8Tester를 실행하세요.
C:\JAVA>java Java8Tester
다음과 같은 출력이 나와야 합니다.
첫 번째 매개변수 존재 여부: false
두 번째 매개변수 존재 여부: true
10