Optional

구름코딩·2020년 10월 4일
0

java8 _ 더 자바

목록 보기
10/23
post-custom-banner

Optional이란?

오직 값 한개가 들어있을 수도 없을 수도 있는 컨테이너

사용

자바 프로그래밍에서 NullPointerException을 종종 보게 되는데, null을 리턴하거나 null protection을 깜박한 경우이다. 이를 방지하기 위해서 Optional을 리턴할 수 있다

클라이언트 코드에게 명시적으로 빈 값일 수도 있다는것을 알려주고, 빈값인 경우에 대한 처리를 강제한다

기존 방식

//OnlineClass Class
private Progress progress;

public Progress getProgress() {
    return progress;
}

//Progress Class
public Duration getStudyDuration() {
	return studyDuration;
}

//Main
OnlineClass springBoot = new OnlineClass(1, "spring boot", true);

//null pointer exception 발생가능성 있다
Duration studyDuration = springBoot.getProgress().getStudyDuration();
System.out.println(studyDuration);

// 보통 null pointer exception을 방지하기 위한 코드 (null protection)
Progress progress = springBoot.getProgress();
if (progress != null)
	System.out.println(progress.getStudyDuration());

Optional사용

public Optional<Progress> getProgress() {
    return Optional.ofNullable(progress); <- null값이 올수 있을 때 사용
    //return Optional.of(progress); <- null이 아닌 값이 올 때 사용
    /*
    만약 널을 반환하고 싶다면 null대신
    Optional.empty()를 반환해야한다. null을 반환시 optional을 사용하는 의미 x
    비어있는 옵셔널 박스를 반환하게 된다
     */
}

//getter에 Optional을 사용하여 null값을 받아오는것을 막을수 있다
Optional<Progress> progress = springBoot.getProgress();
progress.ifPresent(p -> System.out.println(p.getStudyDuration()));

주의사항

  • 리턴값(getter)만 쓰기를 권장한다

메소드 매개변수 타입, 맵의 키 타입, 인스턴스 필드 타입으로 쓰지 말자

  • Optional을 리턴하는 메소드에서 null을 리턴하지 말자

만약 널을 반환하고 싶다면 null대신 Optional.empty()를 반환해야한다. null을 반환시 optional을 사용하는 의미 x
비어있는 옵셔널 박스를 반환하게 된다

  • primitive type용 Optional이 따로 존재한다

OptionalInt, OptionalLong ...

// primitive type에 대한 optional 사용
// 아래 방식은 boxing, unboxing을 반복하므로 비효휼적
Optional.of(10);
// 아래코드처럼 사용
OptionalInt.of(10);
  • Collection, Map, Stream Array, Optional은 Optional로 감싸지말자

이들은 이미 null값에 대한 감지 기능이 존재하는 자료형

참고
참고

profile
내꿈은 숲속의잠자는공주
post-custom-banner

0개의 댓글