[ Optional 개념에 앞서, NPE를 먼저 알아보자. ]
* NPE(Null Pointer Exception)란?
개발할 때 가장 많이 발생하는 예외 중 하나로, null을 호출하게 될 때 발생하는 예외사항이다.
이를 방지하기 위해 null 검사를 해야 하는데 변수가 많을수록 코드가 복잡해질 수 있다.
[ Optional ]
java.util.Optional<T> 클래스 :
Optional<T> 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)입니다.
따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있습니다.
이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있습니다.
즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됩니다.
(출처 : 코딩의 시작, TCP School)
[ Optional 사용 예시 ]
public Optional<Member> findById(Long id) {
return Optional.ofnullable(store.get(id)); //ofnullable : 값이 null이 들어올 수도 있는 경우에 사용
}
[ Optional 객체 접근 ]
Optional<String> opt = Optional.ofNullable("자바 opt 객체")
System.out.println(opt.get());
get() 메소드를 사용하여 Optional 객체 저장된 값에 접근할 수 있다.
이때 저장된 값이 null이면 NoSuchElementException 예외가 발생한다.
[ Optional 호출 시 null 체크 ]
get() 사용 시 null이면 예외를 발생시키므로 bool 타입을 반환하는 isPresent()메소드 통해 null 체크가 필요하다.
String text = getText();
Optional<String> optText = Optional.ofNullable(text);
int length;
if(optText.isPresent()) {
length = optText.get().length();
} else {
length = 0;
]
이를 통해 의문점이 들 수 있다.
NPE 방지를 위해 복잡한 null 체크를 버리고 Optional를 쓰는 건데 또 null 체크를 하다니?
이 부분은 밑에 블로그에서 잘 설명되어 있어 링크로 대신 첨부해 논다.
[ Optional 정리 ]
Optional은 NPE null 체크의 복잡한 부담을 줄이기 위해 나온 Wrapper 클래스이다.
Optional은 Wrapping하고 다시 풀고 null일 경우 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 잘못 사용하면 시스템 성능이 저하될 수 있다. 그렇기 때문에 반환 값이 null이 절대 아니라면 사용하지 않는 것이 좋다.
결과가 null이 될 수 있으며 null에 의해 오류가 발생할 가능성이 매우 높은 경우에만 사용되어야 한다.
'Java' 카테고리의 다른 글
[Java] Reflection API (0) | 2024.02.18 |
---|---|
[Java] Iterator, Enumeration (0) | 2023.10.17 |
[Java] import static 사용하는 이유 (0) | 2023.08.09 |
[Java] Static - 정적 변수와 메서드 (0) | 2023.06.13 |
Intellij tomcat 연동 및 설정 (gradle) (0) | 2023.05.19 |