자바8에서 추가된 클래스로 null과 관련하여 NullPointerException 을 방지하는데 사용된다
기본적으로 대상을 감싸는 Wrapper 클래스이다
메서드의 리턴타입에 사용되는 것을 목적으로 개발된 클래스이다
public Optional<String> getEmail(){
return Optional.ofNullable(this.email);
}
해당 메서드를 사용하는 대상에게 리턴값이 없을수도 있다는 사실을 알려준다
String name= user.getName();
if(name != null){
if(name.contains("zamong")){
System.out.println("안녕 " + name + " !!");
}
}
자바 8이전에는 null을 체크하기 위해 if문을 이용했다
따라서 사용하는 클라이언트가 직접 null체크를 수행하거나 제공하는 쪽에서 null체크를 수행해야 헀다
Exception을 발생시키는 경우,
Checked Exception의 경우 컴파일 단계에서 알려줄 수 있지만 Exception 핸들링을 강제하고
UnChecked Exception의 경우 따로 Handler를 만들어서 해결할 수 있지만 공통적으로 stacktrace를 찍기때문에 자원이 소비된다는 단점이 있다
return 타입으로만 사용하는 것을 권장
Optional을 반환하는 메서드에서 null을 반환하면 안됨
기본형 값은 전용 Optional을 사용
값의 유무를 판단이 가능한 인스턴스는 사용하지 말자
왜 리턴타입일까?
Optional이 사용될 수 있는 다른 위치를 알아보자
- 파라미터
파라미터의 경우 Optional 자체가 null이 될 가능성이 있다- 필드
필드값이 없을수도 있다는 것은 설계자체에 문제가 있을 가능성이 있다- map의 key
map의 key가 없을수도 있다는 것은 map의 설계 목적에 어긋난다
public class Console {
public static void main(String[] args) {
User user = new User();
Optional<String> optionalTest= user.getEmail();
Optional<String> ofValue = Optional.of("of");
// 값이 비어있을 수 있는 optional을 생성한다
Optional<String> nullableValue = Optional.ofNullable(null);
// 값이 비어있거나 null일 수 있는 optional을 생성한다
optionalTest.isPresent(); // 값이 있는지를 boolean으로 반환
optionalTest.isEmpty(); // 값이 없는지를 boolean으로 반환
optionalTest.get(); // optional 안의 값을 반환, 값이 없다면 NoSuchElementException을 발생시킨다
optionalTest.ifPresent(System.out::println); // 값이 있을때, 수행할 작업을 지정한다
optionalTest
.ifPresentOrElse(System.out::println, () -> System.out.println());
// 값이 있을때 수행할 작업과 없을때 수행할 작업을 모두 지정한다
Optional<String> or = optionalTest
.or(() -> Optional.ofNullable(ifEmpty()));
// 값이 없을 경우 반환할 값이나 수행할 작업을 Optional로 감싸서 반환한다
// 값이 있다면 수행되지 않는다 ( 자바 9에서 추가 )
String email = optionalTest
.orElse(ifEmpty());
// 값이 없을경우 반환할 값을 지정한다
// 반환할 값이 메서드라면, 값이 있더라도 수행된다
email = optionalTest
.orElseGet(() -> {
System.out.println("default@email.com");
return "default@email.com";
});
// 값이 없을경우 반환할 값이나 수행할 작업을 지정한다
// 반환할 값이 메서드라면, 값이 없어야만 수행된다
optionalTest.orElseThrow();
// 값이 없을경우 NoSuchElementException 을 던진다
optionalTest.orElseThrow(IllegalStateException::new);
// 값이 없을경우 지정한 Exception을 던진다
}
public static String ifEmpty(){
System.out.println("값이 없었다네요~~");
return "default@email.com";
}
}