Spring Boot/Spring Boot
Optional
Cha_Ji
2021. 2. 23. 12:11
NullPointerException
우리학교 1학년 1반에는 철수와 영희 두 명이 학교에 다닌다.
학교는 오늘 공사가 시작해 모든 짐을 치워야 한다.
학교는 비대면으로 전환되었지만 철수의 실내화는 학교에 있다.
선생님은 어쩔 수 없이 철수에게 실내화를 전해주러 출발했다.
하지만 출석부 속 철수의 집 주소는 비어있었다. 선생님은 갈 길을 잃었다.
없는 주소를 참조할 때 발생하는 널포인터 익셉션은 개발자라면 대부분 접해본 예외입니다.
예외 처리
코드를 실행하는데 문제가 없으려면 예외를 미리 방어해야 합니다.
학창시절 배우는 수학에서도 흔하게 볼 수 있는 예외처리가 존재합니다.
x 나누기 y에서 (단, y는 0이 될 수 없다.)
철수네 집 주소가 없다면 선생님네 집에 보관할 수 있습니다.
public 보관할주소 짐의주인을찾아주는함수(짐){
if (짐.학생() != null){ //짐의 주인이 있을 때
if(학생.주소() != null){ //짐주인의 주소가 있을 때
return 주소;
}
else{
return 선생님주소;
}
}
}
코드가 짧아서 괜찮아 보이지만 null 체크 로직이 많아지면 코드가 못생겨집니다.
코드가 못생겨지면 협업에서도 문제가 생기고 유지 보수에 문제가 생깁니다.
함수형 언어에서는 nullable 형식의 널 일수도 있는 값을 선언할 수 있습니다.
자바에서도 Optional 형식의 클래스를 사용할 수 있습니다.
Optional<T>
Optional은 null일 수 있는 값을 의미합니다. Type을 Optional로 감싸주면 null을 포함시킬 수 있습니다.
기본적인 사용법은 다음과 같습니다.
// null을 포함할 수 있는 Address 타입
Optional<Address> address;
//null을 포함할 수 있는 값
Optional<Address> address = Optional.ofNullable(null);
//비어있는 객체
Optional.empty();
//비어있다면 NoSuchElementException
address.orElse(0);
Optional의 사용으로 null 체크를 간결하게 줄일 수 있습니다.
public 장소 짐전달해주기(){
return Optional.ofNullable(짐)
.map(짐::get주인)
.map(주인::get주소)
.orElse(선생님집);
}
Optional 객체는 Steam이나 Collection과도 비슷한 개념이라고 합니다.
filter(), map(), ifPresent() 메서드도 함께 공부하면 좋을 것 같습니다.