프로그래밍을 할 때 가장 많이 발생하는 예외 중 하나는 바로 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)
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에서 사용할 수 있는 메서드와 추가적인 내용을 다루도록 하겠습니다.
'Languages > Java' 카테고리의 다른 글
[Java]제네릭(Generic)을 쉽게 이해하기(문법과 활용) (2) | 2023.07.21 |
---|---|
[Java]문자열(String)과 리스트(List)의 null, 빈 값인지 확인하는 방법 (15) | 2023.07.20 |
[Java]문자열 클래스 String, StringBuffer, StringBuilder 알아보기 (1) | 2023.07.06 |
[Java]ArrayList와 LinkedList 적절하게 사용하기(Java의 동적 배열) (1) | 2023.07.06 |
[Java]do while, while문은 어떤 상황에서 사용할까? (2) | 2023.07.02 |