Java에는 Optional이라는 특이한 클래스가 존재한다.
Optional이 무엇인지, 왜 사용하는 지에 대해서 알아보자.

Optional이란?

Optional이란 NULL이 발생할 가능성을 감안하는 Wrapper Class이다.

Optional<T> 와 같이 선언을 하고 사용한다.
즉, Optional<T> 내부의 값은 NULL일 수도 있고, 객체 T가 있을 수도 있다.

Optional의 사용

보통 Optional 타입은 DB에서 객체를 조회할 때 많이 사용한다. 만약 조회를 했는데 DB에는 없는 아이디여서 NULL인 객체가 반환이 되었다면?
그 객체에 접근하려고 하면, NPE(Null Point Exception)이 당연히 발생할 것이다.

하지만 Optional 타입은 유용한 여러가지 Method들을 제공한다.

  • isPresent() : Boolean Type으로 객체의 값이 존재하는지 판단한다.
    • 이 Method는 if문들의 나열 대신에 간편하고 유용하게 사용 가능하다.
  • get() : Optional 내의 값을 가져온다.
    • 보통 isPresent()와 묶어서 값이 존재하면 get()을 한다.
  • orElse(something) : NULL이 아니라면, 객체를 반환한다.
    • 하지만 NULL이라면, 객체가 아닌 인자로 넘어온 Something을 반환하게 된다.
  • orElseThrow(Exception) : NULL이라면, Exception 메시지를 띄워버린다.
  • Optional.ofNullable() : 단일 객체에 대해서 NULL을 허용한다.
    • 반드시 NULL이 아니라는 보장이 있다면, Optional.of()도 사용이 가능하다.

주의점

Optinal이 NPE를 방지시켜 주는 좋은 Wrapper Class임은 분명하다.
하지만 Wrapping하고 푸는 과정에서 Overhead가 발생하므로, 성능 저하가 있을 수 있다.
따라서 무조건 NULL이 아닌 객체라면, 굳이 Optional을 쓰지 말자!