Java Optional 알짜만 빼먹기 사용법/등장이유
Java Optional 알짜만 빼먹기 사용법/등장이유
이번 포스팅에서는 Java Optional에 대해서 알아보도록 하겠습니다.
언제? 왜?
Optional 은 Java 8에서 등장을 하게 됩니다. Java 8에서는 Optional 외에 default method, lambda, stream 등 다양한 신규 문법이 등장했습니다. 이는 개인적인 생각으로, 함수형 프로그래밍을 하기 위해 등장했다고 생각합니다.
Optional 은 Null Pointer Exception이 발생하지 않도록 하는 Wrapper class로 Null인 value에 접근하더라도 Null Pointer Exception이 발생하지 않습니다.
Optional 객체 생성
Optional은 empty(), ofNullable(), of() 3가지 메소드로 생성할 수 있습니다.
Optional<String> emptyString = Optional.empty();
empty()
empty() 메소드는 데이터가 빈 Optional 객체를 생성할 때 사용합니다.
String common = null;
Optional<String> nullableString = Optional.ofNullable(common);
ofNullable()
ofNullable() 은 null이 올 수 있는 Optional 객체를 생성할 때 사용합니다.
String common = "common";
Optional<String> commonString = Optional.of(common);
of()
of() 는 반드시 데이턱 있어야 되는 Optional 객체를 생성할 때 사용합니다.
만일 Null 인 객체로 생성 할 경우 NullPointerException 이 발생하게 됩니다.
Optional 객체 데이터 확인
Optional 데이터를 확인하기 위해선 isPresent() 메소드를 사용합니다.
isPresent()
Optional<String> oStr = Optional.of("present");
System.out.println(oStr.isPresent()); /** true */
Optional<String> oStr2 = Optional.ofNullable(null);
System.out.println(oStr2.isPresent()); /** false */
Optional 객체 데이터 접근
Optional 객체의 데이터 접근은 get() 메소드를 사용합니다.
get()
Optional<String> oStr = Optional.empty(); /** or Optional.ofNullable(null);
System.out.println(oStr.get()); /** NoSuchElementException */
oStr = Optional.of("default");
System.out.println(oStr.get()); /** default */
만일 위와 같이 empty() 나 ofNullable()로 생성한 객체에서 발생하는 NoSuchElementException 을 막기 위해서는
orElse() 메소드를 사용합니다.
orElse()
String defaultValue = "default";
Optional<String> oStr = Optional.empty();
System.out.println(oStr.orElse(defaultValue)); /** default */
oStr = Optional.ofNullable(null);
System.out.println(oStr.orElse(defaultValue)); /** default */
orElseGet() 메소드를 사용하면 Function Interface인 Supplier<T> 를 활용할 수 있습니다.
orElseGet()
Supplier<String> stringSupplier = new Supplier<String>() {
@Override
public String get() {
return "aljjabaegi.tistory.com";
}
};
Optional<String> oStr = Optional.empty();
oStr.orElseGet(stringSupplier);
Exception을 발생 시키고 싶다면 orElseThrow() 메소드를 사용합니다.
Supplier<Exception> exceptionSupplier = new Supplier<Exception>() {
@Override
public Exception get() {
return new Exception();
}
};
try{
Optional<String> oStr = Optional.empty();
oStr.orElseThrow(exceptionSupplier);
}catch(Exception e){
System.out.println(e);
}