public final class Optional<T> {
private final T value;
}
Null을 직접 다룰때 NPE( Null Point Exception )이 발생하는 위험성이 있다.
이 문제를 보완하기 위해 null이 등장할 위험이 있는 객체에 대해 Optional을 감싸(Wrapper) 해결하기 위해 등장했다. 그런데 이 과정에서 오버헤드가 발생하므로 잘 못 사용하면 시스템 성능이 저하된다.
따라서 모든 경우에 Optional을 사용하는게 아닌, 메소드의 결과가 null이 될 수 있으며, null에 의해 오류가 발생할 가능성이 매우 높을 때 반환값으로만 사용해야한다. 이 때문에 파라미터로 넘기는게 아닌, 반환 타입으로써 제한적으로 사용되도록 설계되었다.
String str = "abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of("abc");
Optional<String> optVal = Optional.of(null); // NPE 발생
Optional<String> optVal = Optional.ofNullable(null); // OK
Optional<String> optVal = null; // null로 초기화. 바람직하지 않음
Optional<String> optVal = Optional.<String>empty(); // 빈 객체로 초기화
Optional<String> optVal = Optional.ofNullable(null);
// null이면, NoSuchElementException 예외 발생
String str1 = optVal.get();
// null이면, ""를 반환
String str2 = optVal.orElse("");
// null이면, 람다식을 실행
String str3 = optVal.orElseGet(String::new);
// null이면, 예외 발생
// 예외의 종류를 변경할 수 있다.
String str4 = optVal.orElseThrow(NullPointerException::new);
// if( str != null )
// null이면 false, 아니면 true 반환
if( optVal.isPresent() ) { }
// Consumer Lambda
// null일때 람다식 수행, 아니면 무시.
optVal.isPresent( System.out::println );
OptionalInt, OptionalLong, OptionalDouble ...
기본형에서 참조형으로 변환되는 과정을 줄이기 위해 기본형을 위한 다양한 Class를 지원한다.
[Java] 언제 Optional을 사용해야 하는가? 올바른 Optional 사용법 가이드 - (2/2)