728x90

Optional란 ?

Java의 Optional 클래스는 java.util 패키지에 포함되어 있으며, 값이 없는 경우를 표현하기 위한 클래스입니다.

 

Optional<T>는 제네릭 클래스로, 모든 객체 타입을 감쌀 수 있습니다.

 

 

[JAVA] Optional 클래스에 대해 알아보기

Optional 클래스가 등장하기 전에는 Java에서는 null 처리가 항상 문제였습니다. null을 마주하는 경우 프로그램 실행 중에 NullPointerException(NPE)로 인해 프로그램이 죽는 경우가 자주 있습니다.NullPointer

pixx.tistory.com

주요 특징

 

  • 내부적으로 객체 참조를 저장하며, null이 아닌 값을 감쌀 수 있음.
  • null 대신 값을 감싸거나, 비어 있는 상태를 표현(Optional.empty()) 가능.
  • 비용이 큼: 객체 참조를 저장하므로, 기본형 타입(int, double, 등)을 감쌀 때 박싱(Boxing)이 발생.

사용 예시

Optional<Integer> optionalValue = Optional.of(42);
optionalValue.ifPresent(value -> System.out.println("Value: " + value));

 

 

OptionalInt란?

OptionalInt는 Java 8에서 도입된 프리미티브 타입 int를 위한 특별한 Optional 클래스입니다. 기본형 int 타입값을 감싸거나, 값이 없는 경우를 표현하기 위한 Optional의 특수화 클래스입니다.

주요 특징

1. 값의 유무를 표현

  • OptionalInt는 값을 감싸거나(OptionalInt.of(값)), 비어 있는 상태(OptionalInt.empty())를 표현할 수 있습니다.

2. 기본형 int에 최적화

 

  • Optional<T>와 달리, 제네릭이 아닌 기본형 int에 특화되어 있습니다.
  • 박싱(Boxing)언박싱(Unboxing)이 없으므로 성능적으로 효율적입니다.

 

3. 유틸리티 메서드 제공

  • 값을 처리하거나 기본값을 반환하는 데 유용한 메서드들이 포함되어 있습니다.

OptionalInt의 주요 메서드

메서드 설명
static OptionalInt empty() 비어 있는 OptionalInt 객체를 생성합니다.
static OptionalInt of(int value) 값을 포함하는 OptionalInt 객체를 생성합니다.
boolean isPresent() 값이 있는지 확인합니다. (true이면 값이 존재, false이면 비어 있음)
int getAsInt() 값이 존재하면 반환하고, 값이 없으면 예외를 던집니다. (NoSuchElementException)
int orElse(int other) 값이 없으면 기본값을 반환합니다.
void ifPresent(IntConsumer action) 값이 존재하면 제공된 람다식(또는 메서드 참조)을 실행합니다.

 

 

OptionalInt의 사용 예시

값이 있는 경우

OptionalInt optionalInt = OptionalInt.of(42);

if (optionalInt.isPresent()) {
    System.out.println("Value: " + optionalInt.getAsInt()); // 출력: Value: 42
}

값이 없는 경우

OptionalInt optionalInt = OptionalInt.empty();

System.out.println("Is present: " + optionalInt.isPresent()); // 출력: Is present: false
System.out.println("Value or default: " + optionalInt.orElse(0)); // 출력: Value or default: 0

 

isPresent()

OptionalInt optionalInt = OptionalInt.of(100);

optionalInt.ifPresent(value -> System.out.println("Value: " + value)); // 출력: Value: 100

 

최댓값 찾기

import java.util.OptionalInt;
import java.util.Arrays;

public class MaxValueExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        // 1. OptionalInt로 최대값을 받기
        OptionalInt optionalMax = Arrays.stream(arr).max();

        if (optionalMax.isPresent()) {
            System.out.println("OptionalInt 최대값: " + optionalMax.getAsInt());
        } else {
            System.out.println("배열이 비어 있습니다.");
        }

        // 2. getAsInt()를 사용하여 int로 최대값을 받기
        // getAsInt()를 사용한 경우, OptionalInt를 직접 다루지 않고 int로 값을 바로 추출
        int intlMax = Arrays.stream(arr).max().getAsInt();
        System.out.println("int 최대값: " + intlMax);
    }
}

 

  • OptionalInt 사용
    • Arrays.stream(arr).max()는 OptionalInt를 반환합니다.
    • 이 값을 optionalMax 변수에 저장한 후, isPresent()로 값이 있는지 확인하고, 존재하면 getAsInt()로 값을 추출합니다.
  • getAsInt() 사용
    • Arrays.stream(arr).max().getAsInt()는 max()에서 반환된 OptionalInt 객체에서 값을 바로 추출니다.
    • 이 경우, 값이 없으면 예외(NoSuchElementException)가 발생합니다.