오직 값 한개가 들어있을 수도 없을 수도 있는 컨테이너
자바 프로그래밍에서 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());
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()));
메소드 매개변수 타입, 맵의 키 타입, 인스턴스 필드 타입으로 쓰지 말자
만약 널을 반환하고 싶다면 null대신 Optional.empty()를 반환해야한다. null을 반환시 optional을 사용하는 의미 x
비어있는 옵셔널 박스를 반환하게 된다
OptionalInt, OptionalLong ...
// primitive type에 대한 optional 사용
// 아래 방식은 boxing, unboxing을 반복하므로 비효휼적
Optional.of(10);
// 아래코드처럼 사용
OptionalInt.of(10);
이들은 이미 null값에 대한 감지 기능이 존재하는 자료형