Optional Class

김회민·2023년 2월 13일
0

Java

목록 보기
16/16

Optional

public final class Optional<T> {
  private final T value;
}

Null을 직접 다룰때 NPE( Null Point Exception )이 발생하는 위험성이 있다.

이 문제를 보완하기 위해 null이 등장할 위험이 있는 객체에 대해 Optional을 감싸(Wrapper) 해결하기 위해 등장했다. 그런데 이 과정에서 오버헤드가 발생하므로 잘 못 사용하면 시스템 성능이 저하된다.

따라서 모든 경우에 Optional을 사용하는게 아닌, 메소드의 결과가 null이 될 수 있으며, null에 의해 오류가 발생할 가능성이 매우 높을 때 반환값으로만 사용해야한다. 이 때문에 파라미터로 넘기는게 아닌, 반환 타입으로써 제한적으로 사용되도록 설계되었다.

생성

Optional.of

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.empty

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); 

isPresent

// if( str != null )
// null이면 false, 아니면 true 반환
if( optVal.isPresent() ) { } 

// Consumer Lambda 
// null일때 람다식 수행, 아니면 무시.
optVal.isPresent( System.out::println );

기본형 Optional

OptionalInt, OptionalLong, OptionalDouble ...

기본형에서 참조형으로 변환되는 과정을 줄이기 위해 기본형을 위한 다양한 Class를 지원한다.

더 읽어보면 좋은 글

[Java] 언제 Optional을 사용해야 하는가? 올바른 Optional 사용법 가이드 - (2/2)

출저

profile
백엔드 개발자 지망생

0개의 댓글