본문 바로가기
자바/더 자바: Java 8

Optional

by Holy Moly 2022. 3. 27.

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

댓글