04.매일 자바와 함께
Optional Class
Optional 형식을 통해 도메인 모델의 의미를 명확히 만들고, null 참조 대신 값이 없는 상황을 표현해 보자.
Null 참조의 문제점
에러의 근원: NullPointerException코드를 어지럽힘: null 확인 코드아무 의미가 없음: null 은 아무 의미도 표현하지 않는다.자바 철학에 위배: 자바는 개발자로부터 모든 포인터를 숨겼지만 null 포인터는 예외형식 시스템에 구멍을 만듦: null의 의미를 알 수 없음
java.util.Optional<T>
값이 있을 경우 Optional 클래스는 값을 감싼다.
값이 없으면 Optional.empty
Optional 적용 패턴
Optional 객체 만들기
빈 Optional
Optional<Car> optCar = Optional.empty();null이 아닌 Optional
Optional<Car> optCar = Optional.of(car);null 값으로 Optional 만들기
Optional<Car> optCar = Optional.ofNullable(car);
Map으로 Optional 값을 추출하고 변환하기
flatMap으로 Optional 객체 연결
Optional의 직렬화 불가
Optional은 Serializable Interface를 구현하지 않는다.
Optional 클래스를 필드 형식으로 사용할 수 없으니, Optional 로 값을 반환받을 수 있는 메서드를 추가하자.
Optional 스트림 조작
Default Action & Optional unwrap
get(): Optional 에 값이 반드시 있을 경우 사용하자. (없을 경우 NoSuchElementException 발생)orElse(T other): Optional이 값을 포함하지 않을 때 기본값 제공orElseGet(Supplier<? extends T> other): Optional 이 비어있을 경우 기본값 생성orElseThrow(Supplier<? extends X> exceptionSupplier): Optional이 비어있을 때 예외 발생ifPresent(Comsumer<? super T> consumer): 값이 존재할 경우 인수로 넘겨준 동작 실행ifPresentOrElse(Comsumer<? super T> action, Runnable emptyAction): Optional 이 비었을 때 실행할 수 있는 Runnable을 인수로 받음
두 Optional 합치기
Before
After
필터로 특정 값 거르기
Optional 에 값이 있을 경우 filter 동작
Reference
Optional 활용
잠재적으로 null이 될 수 있는 대상을 Optional로 감싸기
예외와 Optional 클래스
예외를 빈 Optional로 처리하기
기본형 Optional 을 사용하지 말자
기본형 Optional 에는
OptionalInt,OptionalLong,OptionalDouble등이 있다.이 기본형 특화 Optional은 다른 일반 Optional과 혼용할 수 없다.
응용
Optional로 프로퍼티에서 지속 시간 읽기
Date & Time API
java.time
java.time package 는
LocalDate,LocalTime,LocalDateTime,Instant,Duration,Period등 새로운 클래스를 제공
LocalDate
시간을 제외한 날짜를 표현하는 불변 객체
생성
사용
LocalTime
날짜를 제외한 시간을 표현하는 불변 객체
생성
사용
LocalDateTime
날짜와 시간을 모두 표현
생성
사용
Instant
기계 전용 유틸리티
Unix epoch time 기준으로 특정 지점까지의 시간을 초로 표현
나노초(10억분의 1초)의 정밀도 제공
Duration
두 시간 객체 사이의 지속시간 Docs
Period
두 시간 객체 사이의 지속 시간을 년,월,일로 표현할 경우 Docs
간격을 표현하는 날짜와 시간 클래스의 공통 메서드
Last updated