Null과 관련된 오류에서 다들 한번쯤은 헤매보았을 것이다.
Null값을 방지하기 위해서는 아래와 같은 코드를 작성해야 했다.
if(names != null){
execute();
}
이렇게 되면 코드가 점점 길어지고 귀찮아진다.
JAVA 8에서부터는 Optional<T>
이라는 유용한 클래스를 제공한다.
Optional<T>
는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE(NullPointerException)가 발생하지 않도록 도와준다. 한 겹 더 감싸져 있다고 생각하면 된다.
Optional.empty()
: 값이 Null인 경우
Optional<String> op = Optional.empty();
System.out.println(op); // Optional.empty
System.out.println(op.isPresent()); // false
Optional.of()
: 값이 Null이 아닌 경우
Null을 저장하려고 하면 NPE가 발생한다.
Optional<String> op = Optional.of("hi");
System.out.println(op); // Optional[hi]
System.out.println(op.isPresent()); // true
Optional.ofNullable()
- 값이 Null일 수도, 아닐 수도 있는 경우
orElse()
를 통해 Null인 경우에도 안전하게 값을 가져올 수도 있다. orElse()
는 isPresent()-get()
를 대체한다.
Optional<String> opjava = Optional.ofNullable("java"); // Optional[java]
Optional<String> op = Optional.ofNullable(null);
System.out.println(op); // Optional.empty
System.out.println(op.orElse("null값이다.")); // null인 경우 반환
참고로 orElse(...)
의 ...
은 empty이든 아니든 실행되므로 orElse(new Member())
같은 코드는 삼가고 이 경우에는 orElseGet()
을 사용하는 것이 좋다.
get()
메소드를 사용하여 객체에 접근할 수 있다. 한 겹 까주는 역할이라고 생각할 수 있다.
Optional<String> op = Optional.ofNullable("spring");
System.out.println(op); // Optional[spring]
System.out.println(op.get()); // spring
잘못된 Optional 사용은 큰 비용을 야기할 수 있으므로, 결과가 null이 될 수 있으며 null에 의해 오류가 발생할 가능성이 매우 높을 때만 반환값으로 사용해야 한다.