1. Question

Optional을 사용한 실용 예제에는 어떤 것들이 있는가?

2. Answer

A. 잠재적으로 null이 될 수 있는 대상을 Optional로 감싸기

Map<String, Object> 형식의 맵이 있는데, 다음처럼 key로 값에 접근한다고 가정한다. 기존 코드는 문자열 key에 해당하는 값이 없으면 null이 반환될 것이다. 이때는 map에서 반환하는 값을 Optional로 감싸서 이를 개선할 수 있다.

// 기존 코드
Object value = map.get("key");

// Optional을 사용한 코드
Optional<Object> optValue =
  Optional.ofNullable(map.get("key"));

B. 예외와 Optional 클래스

자바 API는 어떤 이유에서 값을 제공할 수 없을 때, null을 반환하는 대신 예외를 발생시킬 때도 있다. 이것에 대한 전형적인 예가 문자열을 정수로 변환하는 정적 메서드 Integer.parseInt(String)다. 이 메서드는 문자열을 정수로 바꾸지 못할 때 NumberFormatException을 발생시킨다.

정수로 변환할 수 없는 문자열 문제를 빈 Optional로 해결할 수 있다. 즉 parseIntOptional을 반환하도록 모델링할 수 있다. 다음 코드처럼 parseInt를 감싸는 작은 유틸리티 메서드를 구현해서 Optional을 반환하게 한다.

public class OptionalUtility {
  public static Optional<Integer> stringToInt(String s) {
    try {
      return Optional.of(Integer.parseInt(s));
    } catch (NumberFormatException e) {
      return Optional.empty();
    }
  }
}

C. 응용

// 프로퍼티에서 지속 시간을 읽는 명령형 코드
public int readDuration(Properties props, String name) {
  String value = props.getProperty(name);
  if (value != null) {
    try {
      int i = Integer.parseInt(value);
      if (i > 0) {
        return i;
      }
    } catch (NumberFormatException nfe) { }
  }
  return 0;
}
// Optional을 사용한 코드
public int readDuration(Properties props, String name) {
  return Optional.ofNullable(props.getProperty(name))
    .flatMap(OptionalUtility::stringToInt)
    .filter(i -> i > 0)
    .orElse(0);
}

3. Detail

[Java] Java에서 값이 없는 상황(null)을 처리하는 방법은? (null vs Optional) [Java] Optional 클래스란? [Java] Optional 클래스 사용 방법은?

4. Reference

  • “모던 자바 인 액션” (저자: 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트)

태그:

카테고리:

업데이트:

댓글남기기