Optional은 Java 버전 8부터 도입된 클래스이며, null을 안전하게 처리하기 위해 사용하는 객체입니다. 즉, 값이 null일 수 있는 상황에서 null을 직접적으로 다루지 않으면서 코드를 작성할 수 있도록 도와주는 도구입니다.
null이라는 것은 값이 없음을 의미하는데, 잘못다루면 NullPointerException이라는 예외가 발생하고 프로그램이 비정상적으로 종료될 수 있습니다.
보통 null을 처리하기 위해 if문으로 처리하는 경우가 많은데, 이렇게 된다면 코드가 복잡해지고 처리를 하지 않는 경우에는 위처럼 RuntimeException이 발생할 수가 있습니다.
Optional을 사용하면 null일 수 있다는 상황을 명시적으로 표현할 수 있고 null-safe한 코드를 작성할 수 있습니다.
// 아무 값도 없는 Optional 객체 생성
Optional<String> opt = Optional.empty();
// null이 아닌 값을 가진 Optional 객체 생성, 여기서 null인 경우 예외 발생
Optional<String> opt = Optional.of("Hello");
// 값이 null일 수도 있는 경우
Optional<String> opt = Optional.ofNullable(maybeNullValue);
// orElseGet의 예시
Student student = camp.getStudent()
.orElseGet(() -> new Student("미등록 학생"));
System.out.println(student.getName());
orElse vs. orElseGet
orElse()는 기본값을 항상 확인하는 반면에
orElseGet()은 값이 없을 때만 람다를 실행하므로 효율적입니다.
map(), flatMap(), filter() 등 Stream에서 사용하는 메서드를 Optional에서도 사용할 수 있습니다. 여기서 중첩적인 null 체크 없이도 안전하게 값을 꺼내고, 값을 변환하고, 값에 조건을 걸 수 있습니다.
return Optional.ofNullable(a)
.map(A::getMember)
.map(B::getAddress)
.map(C::getCity)
.orElse("incheon");
자료 및 코드 출처: 스파르타 코딩클럽