on
[모던 자바 인 액션] ch11. null 대신 Optional 클래스
[모던 자바 인 액션] ch11. null 대신 Optional 클래스
11.1 값이 없는 상황을 어떻게 처리할까?
public class Person { private Car car; public Car getCar(){ return car;} } public class Car { private Insurance insurance; public Insurance getInsurance(){ return insurance;} } public class Insurance{ private String name; public String getName(){ return name;} }
위와 같이 자동차와 자동차 보험을 갖고 있는 사람 객체를 중첩 구조로 구현했다고 하자.
public String getCarInsurance(Person person){ return person.getCar().getInsurance().getName(); }
차를 소유하지 않은 사람이 있지만 getCar을 호출하면
person이 null이라면
getInsurance가 null을 반환한다면
11.1.1 보수적인 자세로 NullPointerException 줄이기
NullPointerException을 피하기 위해서..
null 확인 코드를 추가
if (person != null) { Car car = person.getCar(); if (car != null) { ...
반복 패턴 코드를 깊은 의심이라고 부른다. 코드의 구조가 엉망이되고 가독성도 떨어진다.
if (person == null) { return "Unknown" } Car car = person.getCar(); if (car == null){ ...
위 처럼 조금 다른 방식으로 if 블록을 없애고 null 변수가 있으면 즉시 "Unknown"을 반환한다.
하지만 출구가 많아져 유지보수에 어려움이 있다.
11.1.2 null 때문에 발생하는 문제
에러의 근원이다.
코드를 어지럽힌다.
아무 의미가 없다.
자바의 철학에 위배된다 - 모든 포인터를 숨겼지만 null포인터는 예외다.
형식 시스템에 구멍을 만든다. - null이 어떤 의미로 사용되었는지 알 수 없다.
11.2 Optional 클래스 소개
java.util.Optional 라는 새로운 클래스 제공한다.
Optional은 선택형 값을 캡슐화하는 클래스이다.
값이 있으면 Optional 클래스는 값을 감싼다.
반면 값이 없으면 Optional.empty 메서드로 Optional을 반환한다.
Optional.empty는 Optional의 특별한 싱글턴 인스턴스를 반환하는 정적 팩토리 메서드다.
public class Person { // 사람이 차를 소유햇을 수도, 소유하지 않았을 수도 있으므로 Optional정의 private Optional car; public Optional getCar(){ return car;} } public class Car { // 자동차가 보험에 가입되어 있을 수도 아닐 수 도 있으므로 private Optional insurance; public Optional getInsurance(){ return insurance;} } public class Insurance{ // 보험회사에는 반드시 이름이 있다. private String name; public String getName(){ return name;} }
11.3 Optional 적용 패턴
11.3.1 Optional 객체 만들기
빈 Optional
Optional optCar = Optional.empty();
null이 아닌 값으로 Optional 만들기
Optional.of로 null이 아닌 값을 포함하는 Optional을 만들 수 있다.
Optional optCar = Optional.of(car);
car가 null이라면 즉시 NullPointerException 발생
null값으로 Optional 만들기
Optional optCar = Optional.ofNullable(car);
car이 null이면 빈 Optional 객체가 반환된다.
11.3.2 맵으로 Optional의 값을 추출하고 반환하기
이름 정보에 접근하기 전에 insurance가 null인지 확인해야 한다.
Optional은 map 메서드를 지원한다.
Optional optInsurance = Optional,.ofNullable(insurance); Optional name = optInsurance.map(Insurance::getName);
from http://yaelimeee.tistory.com/69 by ccl(A) rewrite - 2021-11-26 02:01:53