-
Optional<> 과 Null (이론편)JAVA/자바공부 2022. 7. 15. 00:39
Optional이란 무엇인가
NullPointer 예외 피할 수 있게 도와주는 클래스.
값을 갖거나 갖지 않을 수 있는 컨테이너.
프로젝트 중에 동료 개발자분 JAVA 코드를 보니 Optional<> 활용이 많더라.
애초에 JPA 사용할때는 .orElseThrow(() → {new Exception}) 형태로 사용했는데,,
정신차리고 보니 전부 if 문으로 null 처리를 하고 있었다… if (ㅇㅇ == null) {} .. 요런식
나도 쓸꺼야… 옵셔널.....
Optional.ofNullable(validatioon).orElseGet(() -> new HashMap<>()); Optional.ofNullable(appDTO.getMultipartFile()).ifPresent(app::setMultipartFile); Optional.ofNullable(appDTO.getUrl()).isPresent()
Null 참조란 무엇인가
1965년 영국 Tony Hoare에 의해서 null 참조 등장. (언어 ALGOL)
“컴파일러가 자동으로 모든 참조가 안전한지 확인하려고.. 값이 없는 상황을 null로 구현” 2009년 발표 중 "죄송...10억 달러짜리 실수.. null을 창조한건 뼈아픈 실수"
구글 이미지 Null은 왜 문제일까?
- 결정적으로 null 값을 참조할때 Error로 프로그램 실행을 중단 시킨다.
- null 확인 코드 추가로 가독성이 떨어진다. (null 확인하는 if문, 들여쓰기, 오타, 깜박함)
- null은 엄밀히 말하자면 의미가 없는 값. 값이 없음을 표현한 것이다.
- 자바 철학 위배 - 개발자에게 포인터(C 공부해야 알듯..)를 숨겼는데 null point가 유일한 예외
- 애초에 null로 지정했던 값이 왜 null로 했었는지 기억이 안나게 된다.
다른 언어에서는 Null 어떻게 처리할까?
- Groovy - safe navigation operator ?.
- def carInsuranceName = person?.car?.insurance?.name
- 값이 있는지 없는지 확인하는 연산자 활용 (safe navigation operator)
- 하스켈, 스칼라
- 함수형 언어
- 값이 있는지 없는지 확인하는 Optional Value = Maybe 형식 제공한다.
- Maybe는 값을 가질수도 안 가질수도 있는 Optional[T] 구조 제공
Java 8 Optional<T> 클래스는 이 Optional Value의 방식에 영향받아서 탄생했다.
java.util.Optional<T>
Optional 사용시
- 값이 있으면, 값을 감싼다. (캡슐화)
- 값이 없으면, Optional.empty 메서드로 Optional (특별한 싱글턴 인스턴스를 반환한다.)
쓰면 좋은 점?
- 컴파일러가 null이 올때 이게 올바른 값인지 판단 할 수 없다. → null Point Exception 회피
- 도메인 모델 의미를 명확하게 한다.
- 설계 의도를 명확하게 할 수 있다.
- 값이 없는 상황에서 우리 데이터 문제인지, 알고리즘 문제인지 구분할 수 있다.
public class Person { private Optional<Car> car; // 아! 사람이 차가 있을 수도 없을 수도 있다. public Optional<Car> getCar() { return car; } } public class Car { private Optional<Insurance> insurance; // 차는 보험이 있을 수도 없을 수도 있다. public Optional<Insurance> getInsurance() { return insurance; } } public class Insurance { private String name; // 보험 회사 이름은 없어서는 안되지..!! public String getName() { return name; } }
출처:
반응형'JAVA > 자바공부' 카테고리의 다른 글
정규식 표현 (자바, 코틀린) - 전화번호, 우편번호, 이메일 (0) 2022.10.14 자바 17로 바꿔야 할까? (자바 JDK 10 ~ 17 정리) (1) 2022.10.01 TIL - Final 키워드 (3) 2022.02.11 TIL - 제네릭(generic) 정리 (0) 2022.02.04 TIL - 자바를 잡아라 (1) 2022.01.06