Kotlin null safy 확장자 공부하다가, 기왕에 optional도 정리
Optional
- Null일수도 Null이 아닐수도 있는 값을 감싸는 Wrapper 클래스, 참조시 Null이어도 NullPointException이 발생하지 않게 해줌
Optional 생성메소드
종류 |
설명 |
of |
Null이 아닌 오브젝트로 생성, Null인 오브젝트로 생성을 시도할 경우 NullPointException 발생 |
empty |
빈 Optional 생성 |
ofNullable |
Null인지 아닌지 알지 못하는 오브젝트로 Optional 생성 |
Optional 값 체크 및 가져오기 메소드
종류 |
설명 |
isPresent |
Optional에 담겨있는 오브젝트가 null인지 체크 |
get |
Optional에 담겨있는 값 가져오기 |
orElse |
Optional이 null이 아닌경우 Optional에 담겨있는 값을 리턴하고 아닌 경우, orElse에 정의된 값이 리턴 |
orElseGet |
Optional이 null이 아닌경우 Optional에 담겨있는 값을 리턴하고 아닌 경우, Supplier로 공급된 값을 리턴 |
orElseThrow |
Optional이 null이 아닌경우 Optional에 담겨있는 값을 리턴하고 아닌 경우 정의한 Exception 발생 |
Optional 응용 메소드
종류 |
설명 |
ifPresent |
Optional이 null이 아닐경우 실행 |
map |
Optional이 null이 mapper를 적용 |
flatmap |
mapper의 리턴값이 또 다른 Optional이라면 한단계의 Optional이 되도록 해줌 |
Optional 사용할 경우
- Optional에 null을 할당 X
- 단순히 값을 얻으려는 목적으로 사용하지 말자
- 생성자, 수정자, 메소드 파라미터를 Optional로 넘기지 말자
- Collection인 경우 Optional을 사용하지말고 빈 Collection으로 넘겨야함
- 반환 타입으로만 사용하자
- 값이 없을 경우 orElse를 사용하지 말고 orElseThrow, orElseGet으로 기본값 반환을 정의하자
Optional을 남발하지 말아야하는 이유
- 코드의 가독성을 떨어뜨림
- 시간적, 공간적 비용이 증대됨, Optional객체에 저장하기 위한 메모리비용과 Optional객체에 데이터 접근 비용 증대
- 직렬화 문제가 발생할 수 있음 (Optional은 직렬화를 지원하지 않음)