WEEK 3-4: Java Optional

ensalada.de.pollo·2025년 5월 3일

be

목록 보기
8/44

Optional

Optional은 Java 버전 8부터 도입된 클래스이며, null을 안전하게 처리하기 위해 사용하는 객체입니다. 즉, 값이 null일 수 있는 상황에서 null을 직접적으로 다루지 않으면서 코드를 작성할 수 있도록 도와주는 도구입니다.

Optional의 필요성?

null이라는 것은 값이 없음을 의미하는데, 잘못다루면 NullPointerException이라는 예외가 발생하고 프로그램이 비정상적으로 종료될 수 있습니다.
보통 null을 처리하기 위해 if문으로 처리하는 경우가 많은데, 이렇게 된다면 코드가 복잡해지고 처리를 하지 않는 경우에는 위처럼 RuntimeException이 발생할 수가 있습니다.
Optional을 사용하면 null일 수 있다는 상황을 명시적으로 표현할 수 있고 null-safe한 코드를 작성할 수 있습니다.

Optional의 사용법

Optional 객체의 생성

// 아무 값도 없는 Optional 객체 생성
Optional<String> opt = Optional.empty();

// null이 아닌 값을 가진 Optional 객체 생성, 여기서 null인 경우 예외 발생
Optional<String> opt = Optional.of("Hello");

// 값이 null일 수도 있는 경우
Optional<String> opt = Optional.ofNullable(maybeNullValue);

Optional 값 꺼내기

  • isPresent(): 값이 있으면 true, 없으면 false를 반환
  • get(): 값이 있으면 반환, 없으면 예외 발생
  • orElse(default): 값이 있으면 반환, 없으면 지정된 기본값을 반환
  • orElseGet(Supplier): 값이 없을 때에만 Supplier를 실행해서 반환
  • orElseThrow(Exception): 값이 없으면 예외 발생
// orElseGet의 예시
Student student = camp.getStudent()
					.orElseGet(() -> new Student("미등록 학생"));
System.out.println(student.getName());

orElse vs. orElseGet

orElse()는 기본값을 항상 확인하는 반면에
orElseGet()은 값이 없을 때만 람다를 실행하므로 효율적입니다.

Optional 주요 메서드

map(), flatMap(), filter() 등 Stream에서 사용하는 메서드를 Optional에서도 사용할 수 있습니다. 여기서 중첩적인 null 체크 없이도 안전하게 값을 꺼내고, 값을 변환하고, 값에 조건을 걸 수 있습니다.

return Optional.ofNullable(a)
	.map(A::getMember)
    .map(B::getAddress)
    .map(C::getCity)
    .orElse("incheon");

Optional의 장점

  • NullPointerException 방지
  • 가독성 및 유지보수성 향상
  • 메서드 반환 타입에 사용하여 nullable인 상황을 명확하게 표현할 수 있음

주의점

  • Optional은 주로 반환 타입으로 사용이 되며, 필드나 파라미터 타입으로는 권장되지 않습니다.
  • 장점이 많은 만큼 성능에 부하를 줄 수 있으므로 남용하면 안 되고, null이 자주 발생할 수 있는 상황에서만 사용하는 것이 좋습니다.

자료 및 코드 출처: 스파르타 코딩클럽

0개의 댓글