본문 바로가기
Java

NPE의 대처 방안 Optional

by 완기 2021. 3. 1.
728x90
반응형

자바로 개발을 하다 보니 타입에 대한 강제성 때문에 곤란한 적이 한두 번이 아니다.

 

이런 점은 분명 데이터의 무결성을 지켜준다는 점에선 굉장히 이득이지만, 개발을 하면서 귀찮은 것이 한 둘이 아니다.

 

그리고 객체나 파라미터를 가지고 null이나 빈 문자열을 체크할 때가 많다.

 

if(student == null){
	doSomething();
}else{
	doSomething();	
}

예를 들면 이런 경우다.

 

혹은

 

save(student)

와 같은 경우에 NPE가 발생하는 등, 수많은 경우에서 객체가 null일 때,

 

Exception을 발생시키는 게 아니라 값이 없음을 표현하고 없을 때, 로직을 처리하는 방안을 마련하는 게 좋다.

 

Exception을 발생시키는 건 썩 좋은 상황은 아니기 때문이다.

 


Optional의 등장 배경

… it was not to be a general purpose Maybe type, 
as much as many people would have liked us to do so. 
Our intention was to provide a limited mechanism for library method return types 
where there needed to be a clear way to represent “no result” …

해석하면 서론에서 언급했던 이유와 비슷하다.

 

Optional은 제한적인 범위에서 라이브러리나 메서드 객채 등, 결과 값이 없음을 표현할 필요가 있다는 점에서 만들어졌고, 

Integer같이 값을 감싸는 Wrapper 클래스이다. 

 

그렇기 때문에 인스턴스화 할 수 없으며, 메서드는 Optional 객체 자체를 바라봐야 한다.

 

Optional<Student> opt =new Optional<>(); -> (X)

Optional<Student> opt =Optional.empty(); -> (O)

위처럼 의미다.

 

 

이 곳을 클릭하면 Optional을 사용할 때, 주의점이 소개되어있다.

 

null체크와 데이터 무결성 체크, 그리고 코드가 상당히 많이 줄 수 있다.

 

에제를 써가며 사용하는 것보단 공식 document를 보고 직접 활용해보는 편이 좋다.

 

예제 코드가 굉장히 자세히 잘 나와있으니 한 번 잘 사용해보자.

 

참고 : 

 

Optional (Java SE 9 & JDK 9 )

If a value is present, returns the result of applying the given Optional-bearing mapping function to the value, otherwise returns an empty Optional. This method is similar to map(Function), but the mapping function is one whose result is already an Optiona

docs.oracle.com

 

 

26 Reasons Why Using Optional Correctly Is Not Optional - DZone Java

We take a look at the top 25 most important concepts to keep in mind when working with Optionals in Java, focusing on null variables and more.

dzone.com

 

 

Java Optional 바르게 쓰기

Java Optional 바르게 쓰기Brian Goetz는 스택오버플로우에서 Optional을 만든 의도에 대해 다음과 같이 말했다. … it was not to be a general purpose Maybe type, as much as many people would have liked us to do so. Our intention w

homoefficio.github.io

 

728x90
728x90

댓글