Optional은 null 처리를 편리하게 처리하기 위해서 만든 클래스이다.
NPE(Null Pointer Exception) 방지를 위해 자주 쓰인다.
java.util 패키지에 속해있으며 다음과 같이 선언되어있다.
public final class Optional<T>
extends Object
Object 클래스를 확장했고 Generic한 클래스이다.
final 클래스로 선언되어서 확장이 불가능하다 (즉 자식 클래스를 만들수 없다.)
.empty( )
: 데이터가 없는 Optional 객체를 생성할때 사용
Optional<String> optinalEmpty = Optional.empty();
System.out.println("optinalEmpty : " + optinalEmpty);
// optinalEmpty : Optional.empty
.of( )
: 반드시 데이터가 들어갈 수 있는 상황일때 사용
String word = "test";
Optional<String> optionalOf = Optional.of(word);
System.out.println("optionalOf : " + optionalOf);
// optionalOf : Optional[test]
word = null;
Optional<String> optionalOf_2 = Optional.of(word);
System.out.println("optionalOf_2 : " + optionalOf_2);
// NPE(Null Pointer Exception) 발생
.ofNullable( )
: null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성
String word = "test";
Optional<String> optionalOfNullable = Optional.ofNullable(word);
System.out.println("optionalOfNullable : " + optionalOfNullable);
// optionalOfNullable : Optional[test]
word = null;
Optional<String> optionalOfNullable_2 = Optional.ofNullable(word);
System.out.println("optionalOfNullable_2 : " + optionalOfNullable_2);
// optionalOfNullable_2 : Optional.empty
.ofNullable( ) 메서드 내부에 null 값이 들어올경우 .of( ) 메서드와 달리 NPE를 발생시키지않고 Optional.empty( )와 동일하게 비어 있는 Optional 객체를 가져온다.
.isPresent( )
: Optional 클래스가 비어있는지 확인할때 사용
String word = "test";
System.out.println(Optional.of(word).isPresent());
// true
word = null;
System.out.println(Optional.ofNullable(word).isPresent());
// false
.get( )
: 데이터가 없을경우 null 리턴
Optional<String> optionalGet = Arrays.asList("test1", "test2").stream().findFirst();
System.out.println("optionalGet : " + optionalGet.get());
// optionalGet : test1
Optional<String> optionalGet = Arrays.asList(null, "test2").stream().findFirst();
System.out.println("optionalGet : " + optionalGet.get());
// NPE(Null Pointer Exception) 발생
.orElse( )
: 데이터가 없을경우 기본값을 지정해준다. (데이터가 있든 없든 무조건 실행된다)
String username = "이름";
String result = Optional.ofNullable(username).orElse("no name");
System.out.println("result : " + result);
// result : 이름
String username = null;
String result = Optional.ofNullable(username).orElse("no name");
System.out.println("result : " + result);
// result : no name
.orElseGet( )
: orElse( )는 null이든 아니든 무조건 실행되지만, orElseGet( )은 null일때만 실행이된다.
.orElseThrow( )
:데이터가 없을경우에 예외를 발생시키기 위해 사용한다.
출처
- 자바의 신 (책)