Optional 소개
자바 프로그래밍에서 NullPointerException을 종종 보게 되는 이유
● null을 리턴하니까! && null 체크를 깜빡했으니까!
메소드에서 작업 중 특별한 상황에서 값을 제대로 리턴할 수 없는 경우 선택할 수 있는 방법
● 예외를 던진다. (비싸다, 스택트레이스를 찍어두니까.)
● null을 리턴한다. (비용 문제가 없지만 그 코드를 사용하는 클리어인트 코드가 주의해야 한다.)
● (자바 8부터) Optional을 리턴한다. (클라이언트에 코드에게 "명시적"으로 빈 값일 수도 있다는 걸 알려주고, 빈 값인 경우에 대한 처리를 강제한다.)
Optional
● 오직 값 한 개가 들어있을 수도 없을 수도 있는 컨테이너.
주의할 것
● 리턴값으로만 쓰기를 권장한다. (메소드 매개변수 타입, 맵의 키 타입, 인스턴스 필드 타입으로 쓰지 말자.)
● Optional을 리턴하는 메소드에서 null을 리턴하지 말자.
● 프리미티브 타입용 Optional을 따로있다. OptionalInt, OptionalLong,...
● Collection, Map, Stream Array, Optional은 Opiontal로 감싸지 말 것.
public Progress progress;
public Progress getProgress1(){
return progress;
}
OnlineClass spring_boot = new OnlineClass(1,"spring boot", true);
Progress progress = spring_boot.getProgress1();
// NullPointerException 보고 싶지 않은 친구
System.out.println(progress.getStudyDuration());

// 매번 null을 체크 해주어야함..
// 사람이라 에러 만들기 딱 좋은 코드다
if (progress != null){
System.out.println(progress.getStudyDuration());
}
따라서 아래와 같이 리턴타입을 Optional로 변경
public Optional<Progress> getProgress() {
return Optional.empty();
}
Optional<Progress> progress = spring_boot.getProgress();
progress.ifPresent(p-> {
p.getStudyDuration();
System.out.println("실행안됩니다~");
});

Optional로 변경하고 나면 ifPresent 메서드를 통해 쉽게 null을 처리할 수 있다
코드 참고:https://github.com/whiteship/java8/commit/2cc71c35a005dee32294f329844b26b81c52e75a
'자바 > 더 자바: Java 8' 카테고리의 다른 글
Optional API (0) | 2022.03.27 |
---|---|
Stream API (0) | 2022.03.26 |
Stream (0) | 2022.03.26 |
자바 8 API의 기본 메소드와 스태틱 메소드 (0) | 2022.03.26 |
메소드 레퍼런스 (0) | 2022.03.26 |
댓글