티스토리 뷰

헉!!/jsp, java

[Java] Optional

권태성 2024. 7. 20. 23:55
728x90

app.getProgress().getStudyDuration()과 같이 호출 할 때 progress가 null인 경우 NullPointerException가 발생하는 것이 흔한 일이었음

그래서

if (progress ≠ null) {
}

과 같이 null 체크를 해줘야했음.

public Progress getProgress() {
	if (this.progress != null) {
		throw new IllegalStateException();
	}
	return progress;
}

위와 같이 null 인 경우 에러를 throw 하기도 했었으나 좋은 사용 예는 아님

Java8에서 부터는 비어있는 값이 있을 경우 Optional을 이용해서 처리할 수 있음

public Optional<Progress> getProgresS() {
	return Optional.ofNullable(progress);
}
  • Optional은 여러 곳에서 사용할 수 있지만 return type으로 쓰는 것이 권장사항
  • Collection, Map, Stream Array, Optional은 Optional로 감싸지 말 것 (컨테이너 성격의 instance 들은 Optional로 두 번 감싸는 것과 같음)
Optional.of(progress); // Null 값 비 허용 > NullPointerException
Optional.ofNullable(progress); // Null 값 허용

Optional.ifPresent

프리미티브 타입용 Optional은 따로 있음

  • OptionalInt
  • OptionalLong
  • 등등

Optional 만들기

  • Optional.of()
  • Optional.ofNullable()
  • Optional.empty()

Optional에 값이 있는지 없는지 확인하기

  • isPresent()
  • isEmpty() (Java 11~)

Optional에 있는 값 가져오기

  • get()
  • 만약에 비어있는 Optional에서 무언가를 꺼낸다면?

Optional에 값이 있는 경우에 그 값을 가지고 ~~를 하라

  • ifPresent(Consumer)
  • 예) Spring으로 시작하는 수업이 있으면 id를 출력하라

Optional에 값이 있으면 가져오고 없는 경우에 ~~를 리턴하라

  • orElse(T)
  • 예) JPA로 시작하는 수업이 없다면 비어있는 수업을 리턴하라

Optional에 값이 있으면 가져오고 없는 경우에 ~~를 하라

  • orElseGet(Supplier)
  • 예) JPA로 시작하는 수업이 없다면 새로 만들어서 리턴하라

Optional에 값이 있으면 가져오고 없는 경우 에러를 던져라

  • orElseThrow()

Optional에 들어있는 값 걸러내기

  • Optional filter (Predicate)

Optional에 들어있는 값 변환하기

  • Optional map(Function)
  • Optional flatMap(Function) : Optional 안에 들어있는 인스턴스가 Optional인 경우에 사용하면 편리함
728x90