Optional

Null Pointer Exception을 피하는 방법 - Optional

Optional은 java 8부터 추가된 Optional은 null pointer를 피하기 위한 방법 중 하나이다.

예를 들어 아래와 같은 코드가 있다고 가정하자

//computer는 Computer 클래스의 인스턴스 변수
//getSoundcard()는 Soundcard 클래스를 반환
//getUSB()는 USB 클래스를 반환
//getVersion()은 Version 클래스를 반환한다고 가정
String version = computer.getSoundcard().getUSB().getVersion();

위 코드에서 getVersion() 메소드까지 호출하는 도중에 null을 하나라도 반환한다면 Null Pointer Execption이 발생할 것이다.

이런 Null Pointer Exception 방지하기 위해선, 기존엔 다음과 같은 코드가 필요했다.

String version = "UNKNOWN";
if(computer != null){
  Soundcard soundcard = computer.getSoundcard();
  if(soundcard != null){
    USB usb = soundcard.getUSB();
    if(usb != null){
      version = usb.getVersion();
    }
  }
}

그러나 Optional 오브젝트를 사용하여 반환한다면 각종 메서드를 통해 if문으로 null 체크하던 코드들을 간략하게 만들 수 있다.

예를 들어 위 코드는 아래와 같이 사용될 수 있다.

//computer는 Optional<Computer>의 인스턴스 변수임.
String name = computer.flatMap(Computer::getSoundcard)
                          .flatMap(Soundcard::getUSB)
                          .map(USB::getVersion)
                          .orElse("UNKNOWN");

Optional을 통해 Optional 이 갖고 있는 객체가 null이 아닌 경우에만 코드를 적용할 수 있어, Null Pointer Exception을 방지하는데 유용하다.


https://www.oracle.com/technical-resources/articles/java/java8-optional.html 에 Optional에 대한 설명이 자세히 나와있으니 읽어보기 바란다.