Languages/Java

[Java]안정적인 NULL 처리가 가능한 Optional 알아보기(NullPointerException)

MoonSta 2023. 7. 16. 12:34

 프로그래밍을 할 때 가장 많이 발생하는 예외 중 하나는 바로 NullPointerException입니다. 해당 예외는 실제 값이 아닌 null을 갖고 있는 객체 및 변수를 호출할 때 발생하는 예외입니다. 이와 같은 예외를 예방하기 위해 개발자는 조건문을 사용하여 null을 확인하곤 합니다. 하지만 Java 8 이후 등장한 Optional <T> 클래스를 이용하여 복잡한 조건문 없이 NullPointerException을 예방할 수 있습니다.

 


 

Optional 클래스란?

'선택사항'이라는 뜻을 가지고 있는 Optional 클래스에 대해 알아보겠습니다.

 

public final class Optional<T> {
 
   /**
   *if non-null, the value, if null, indicates no value is present
   */
   private final T value;
 }

 

Optional <T> 클래스는 NULL값으로 올 수도 있는 특정 변수를 감싸주는 Wrapper 클래스입니다. Optional 클래스는 제너릭(Generic)으로 변수에 타입을 지정해주어야 합니다. 또한 Optional 클래스는 다양한 메서드를 제공하고 각 메서드를 통해 값에 접근하기 때문에 직접적인 NullPointerException을 예방할 수 있다.

 

 

2022.12.15 - [Languages/Java] - [JAVA] 제네릭(Generic)

 

[JAVA] 제네릭(Generic)

⚡제네릭(Generic) 이번 포스팅은 Java 5부터 등장한 제네릭(Generic)에 대하여 알아보겠습니다. 제네릭(Generic)은 일반화한다는 뜻을 가진 generalize에서 비롯된 말 입니다. 그럼 이쯤에서 생각해볼 수

mooonstar.tistory.com

 


 

Optinal의 등장 이전에는?

 

public class StudentRepository {
   Student findByName(String name);
}

 

 Optional 사용 이전의 처리 방법에 대해 알아보겠습니다. 예를 들어 MemberRepository가 존재하고 특정 회원의 나이를 알기 위해 데이터를 가져온다고 가정했을 때 위에 지정한 findByName를 호출하였지만, 인자로 보낸 name의 값이 null일 경우 NullPointerException이 발생합니다. 따라서 Optional이 등장하기 전에는 개발자는 복잡한 조건문으로 null 체크를 하였습니다. 

 

public class StudentRepository {
  if(name != null) {
    Student findByName(String name);
  }
}

 

 위와 같이 null이 들어올 수 있는 값에 방어 로직을 추가하여  NullPointerException를 예방하였습니다. 하지만 변수가 많아지고 null을 체크해야 하는 경우가 많아진다면 그만큼 코드가 복잡해지기 때문에 Optional을 사용하게 표현할 수 있습니다.

 


 

Optional의 사용 

 

public class StudentRepository {
   Student findByName(String name);
}

 

이와 같이 NullPointerException을 유발할 수 있는 코드를 반환 타입 Optional로 지정하여 사용할 수 있습니다.

 

 

public class StudentRepository {
   Optional<Student> findByName(String name);
}

 

 메서드가 반환될 결괏값이 NULL이 될 수 있는 상황에서 반환타입을 Optional로 지정함으로써 NULL을 예방하자는 것이 Otional의 주된 목적입니다.

 

 


 

Optional 객체 생성하는 방법

 

Optional<String> obj = Optional.empty();

System.out.println(obj.isPresent());

//false

 

 

 empty() 메서드를 사용하면 간단하게 빈 Optional 객체를 생성할 수 있습니다. 생성된 객체는 싱글톤 인스턴스를 반환하게 되며 비어있는 건 null과 동일하지만, NullPointerException을 발생시키지 않습니다.  

 

 

 또 다른 방법으로는 Optinal.of() 메서드가 있습니다. 

 

Optinal<String> obj = Optional.of(str);

 

 

 위의 방식으로 Optional 객체를 만들게 되면 null이 아닌 객체로 Optional을 생성할 수 있습니다. 하지만 of 메서드를 사용하는 경우에 str이 null이라면 NullPointerException이 발생합니다. 그렇기 때문에 null이 들어오는 경우 NullPointerException을 예방하기 위해 빈 Optional이 되도록 만들어야 합니다. 방법은 다음과 같습니다.

 

Optional<String> obj = Optional.ofNullable(str);

 

위와 같이 코드를 작성하게되면 str에 null 값이 들어오는 경우에 NullPointerException를 발생시키지 않고, 빈 Optional 객체를 생성해 줍니다.

 

 

 이번 포스팅에서는 Optional 등장 이전과 등장 이후에 변화와 간단하게 Optional 생성 방법에 대해 알아보았습니다. 다음 포스팅에서는 Optional에서 사용할 수 있는 메서드와 추가적인 내용을 다루도록 하겠습니다.