본문 바로가기

프로그래밍 언어 (プログラミング言語)/JAVA

Optional<T>의 탄생 배경

자바로 개발을 하다 보면 자주 많나는 NPE(NullPointerException)이라는 예외가 있다.

고로, 코드 아래와 같이 레퍼런스 변수가 null인 것을 참조하는 경우, NPE가 터지기 때문에

항상 레퍼런스 변수가 null인지 아닌지 확인하는 코드를 작성해야 하는 번잡함이 있다.

List<String> names = getNames();

names.sort(); // names가 null이라면 NPE가 발생함

List<String> names = getNames();

// NPE를 방지하기 위해 null 검사를 해야함
if(names != null){
    names.sort();
}

 

[ Optional이란? ]

Java8에서는 Optional<T> 클래스를 사용해 NPE를 방지할 수 있도록 도와준다. Optional<T>는 null이 올 수 있는 값을 감싸

는 Wrapper 클래스로, 참조하더라도 NPE가 발생하지 않도록 도와준다. Optional 클래스는 아래와 같은 value에 값을 저장

하기 때문에 값이 null이더라도 바로 NPE가 발생하지 않으며( 클래스의 필드값이 null이라고 해서, 예외는 터지지 않는다)

클래스이기 때문에 각종 메소드를 제공해준다.

public final class Optional<T> {

  // If non-null, the value; if null, indicates no value is present
  
  private final T value; // T 객체를 Optional이라는 클래스로 wrapping을 했다. 
   
  ...
}

 

-> 객체를 Optional 클래스로 wrapping함으로써, 그 객체가 null을 참조하지 못하게 하여, NPE 예외를 터트리지 않게 하기 위해서 나온 것이 Optional 클래스이다. 

[ Optional 정리 ]

Optional은 null 또는 값을 감싸서 NPE(NullPointerException)로부터 부담을 줄이기 위해 등장한 Wrapper 클래스다.

Optional은 값을 Wrapping하고 다시 풀고, null 일 경우에는 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 잘못 사

용하면 시스템 성능이 저하된다.

그렇기 때문에 메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 좋다

 즉, Optional은 메소드의 결과가 null이 될 수 있으며, null에 의해 오류가 발생할 가능성이 매우 높을 때 반환값으로만 사용

되어야 한다