Optional<T> : java.util.Optional
。JAVA 8에서 등장하여 NPE ( NullPointerException ) 발생을 사전에 방지하고자 Null이 올 수 있는 값을 감싸는 Wrapper 클래스
▶ Null 값이 도출되었을때, 예외 발생에 대한 대응을 위한 Final 클래스
。Generic 클래스 이므로, Place Holder에는 Optional 객체가 어느 Type의 데이터를 저장해야 하는지 제약하여 타입안전성 확보
▶ 정의를 안하는 경우 get() 호출 시 Object Type으로 반환
。Spring JPA의 메서드가 반환 시 주로 활용하는 Data type으로 Repository객체를 통해 CRUD를 수행 시 Optional 객체로 반환
Optional 사용 시 주의사항
。Optional은 메서드 반환타입으로 주로 명시.
▶ 필드, 매개변수에 Optional을 직접 명시하는 것은 권장 X
class Member{
private Optional<String> name;
private void setName(Optional<String> name){
}
public Optional<String> findMember(String id)
Optional 인스턴스 메소드
Optional객체.isPresent()
。Optional객체의 데이터의 존재여부( Null이 아닌 여부 )를 boolean으로 return
if (opt.isPresent()) {
String name = opt.get();
System.out.println(name);
} else {
System.out.println("없음");
}
Optional객체.orElseGet(람다식)
。Optional객체의 데이터가 null인 경우 람다식을 활용해 특정값으로 반환
▶ 객체의 데이터가 null이므로 람다식 매개변수를 정의하지 않는다.
Optional객체.orElse(변수)
。Optional객체의 데이터가 Null인 경우 매개변수에 입력된 특정값을 반환
Optional<SomeClass> op1 = Optional.of(null);
SomeClass output1 = op1.orElseGet(() -> new SomeClass(1));
SomeClass output2 = op1.orElse(new SomeClass(1));
Optional객체.ifPresent(람다식)
。Optional객체의 데이터를 포함하는 경우 내부 람다식을 실행하며 Null인 경우 실행되지 않음.
▶Optional객체의 데이터가 존재하므로 람다식 매개변수를 정의하여 Optional객체의 데이터를 전달
。void로서 반환값이 없음
Optional<SomeClass> op = Optional.of(new SomeClass(1));
op.ifPresent((obj)->{
System.out.println(obj.age);
});
Optional객체.ifPresentOrElse( null 아닌 경우 람다식 , null인 경우 람다식 ) :
。Optional 객체의 데이터가 null이 아닌 경우와 null인 경우 실행할 람다식을 모두 정의하여 2가지 경우를 모두 대응
。 Optional 객체의 데이터가 존재하는 람다식은 매개변수를 정의하고 존재하지 않는 람다식은 매개변수를 정의하지 않는다.
。void로서 반환값이 없음
Optional<SomeClass> op1 = Optional.ofNullable(null);
op1.ifPresentOrElse((obj)->{
System.out.println(obj.age);
} , ()->{
System.out.println("null");
});
Optional객체.orElseThrow(람다식)
。Optional 객체의 데이터가 Null 인 경우 람다식을 통해 Exception 객체를 return하여 예외를 throw
▶ 현업에서 제일 많이 사용하는 경우
。매개변수에 정의하는 람다식은 Exception 객체를 생성하여 return하도록 정의
▶ 생성자참조를 통해 람다식을 축약할 수 있음
▶ Throwable 인터페이스 ( = 최상위 부모 )를 구현하는 Exception 클래스 객체를 생성하여 return 하도록 설정
Optional<SomeClass> op1 = Optional.ofNullable(null);
op1.orElseThrow(()->{
return new IllegalArgumentException();
});
Optional<SomeClass> op1 = Optional.ofNullable(null);
op1.orElseThrow(IllegalArgumentException::new);