Optional<T>

Optional 이란?

Optional은 Java 8에서 도입된 클래스로, 값의 존재 여부를 나타내는 컨테이너 클래스입니다. 주로 null 값을 다루는 데 사용되며, NullPointerException을 방지하고 안전한 코드 작성을 도와줍니다.

컨테이너 클래스는 다른 객체를 담는 용도로 사용되는 클래스입니다. 객체들을 그룹화하고, 저장하고, 관리하는 데 사용됩니다. 자바에서는 다양한 컨테이너 클래스를 제공하여 데이터를 구조화하고 다룰 수 있도록 도와줍니다.

https://www.callicoder.com/java-8-optional-tutorial/

특징

  • 값의 존재 여부 표현: Optional은 값이 존재할 수도 있고, 존재하지 않을 수도 있다는 개념을 표현합니다. 값이 존재할 경우 해당 값을 감싸고, 존재하지 않을 경우에는 비어있는 상태로 나타냅니다.
  • 메서드 체이닝: Optional은 메서드 체이닝을 통해 간편한 코드 작성을 가능하게 합니다. 메서드 호출 결과로 Optional을 반환하는 메서드를 연속적으로 호출할 수 있으며, 값이 있는 경우에만 다음 메서드를 호출하고, 값이 없는 경우에는 무시됩니다.
  • Null 값 처리: Optional은 값을 확인하고 null일 경우 대체값을 제공하거나, 예외를 던지는 등의 방식으로 Null 값 처리를 유연하게 할 수 있습니다.

 

메소드

Optional 클래스는 값의 존재 여부를 나타내는 컨테이너 클래스로, 다양한 메서드를 제공하여 값의 처리를 간편하게 할 수 있습니다. 다음은 Optional 클래스의 주요 메서드와 사용법에 대한 자세한 설명과 예시 코드입니다.

 

  • of(): 주어진 값으로 Optional 객체를 생성합니다. 값이 null이 아니어야 합니다.
Optional<String> optionalValue = Optional.of("Hello");
  • ofNullable(): 주어진 값으로 Optional 객체를 생성합니다. 값이 null일 수 있습니다.
String name = getName();
Optional<String> optionalName = Optional.ofNullable(name);
  • isPresent(): Optional 객체에 값이 존재하는지 여부를 반환합니다.
Optional<String> optionalValue = Optional.of("Hello");
boolean isPresent = optionalValue.isPresent();
  • get(): Optional 객체의 값을 반환합니다. 값이 존재하지 않을 경우 NoSuchElementException이 발생합니다. 주의해야 할 점은, 이 메서드는 값을 직접 가져오는 것이므로, 값이 존재하는지 먼저 확인해야 합니다.
Optional<String> optionalValue = Optional.of("Hello");
String value = optionalValue.get();
  • orElse(): 값이 존재하지 않을 경우 대체값을 반환합니다.
Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElse("Default Value");
  • orElseGet(): 값이 존재하지 않을 경우 대체값을 생성하는 Supplier 함수를 사용하여 반환합니다.
Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseGet(() -> generateDefaultValue());
  • orElseThrow(): 값이 존재하지 않을 경우 지정된 예외를 발생시킵니다.
Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseThrow(() -> new RuntimeException("Value not found"));
  • ifPresent(): 값이 존재할 경우에만 주어진 동작(Consumer 함수)을 실행합니다.
Optional<String> optionalValue = Optional.of("Hello");
optionalValue.ifPresent(value -> System.out.println("Value: " + value));
  • filter(): 값이 주어진 조건(Predicate)을 만족하는지 여부를 검사하여 Optional 객체를 반환합니다.
Optional<Integer> optionalNumber = Optional.of(42);
Optional<Integer> filteredNumber = optionalNumber.filter(num -> num > 50);
  • map(): Optional 객체에 포함된 값을 주어진 함수를 통해 변환한 후, 그 결과를 포함하는 새로운 Optional 객체를 반환합니다.
Optional<String> optionalValue = Optional.of("Hello");
Optional<Integer> mappedValue = optionalValue.map(String::length);
  • flatMap(): Optional 객체에 포함된 값을 주어진 함수를 통해 변환한 후, 그 결과를 포함하는 새로운 Optional 객체를 반환합니다. 함수의 반환 타입은 Optional이어야 합니다.
Optional<String> optionalValue = Optional.of("Hello");
Optional<Character> flatMappedValue = optionalValue.flatMap(str -> Optional.ofNullable(str.charAt(0)));

OptinalInt, OptionalLong, OptionalDouble

OptionalInt, OptionalLong, OptionalDouble은 Java 8부터 도입된 Optional 클래스의 특수한 형태입니다. 이들은 각각 int, long, double 타입의 값을 갖는 Optional을 제공하여 기본형(primitive type)의 값들을 처리할 수 있도록 합니다.

 

OptionalInt, OptionalLong, OptionalDouble 클래스는 Optional 클래스와 동일한 개념과 사용법을 가지고 있으며, null 대신에 해당 기본형의 값을 갖습니다. 이들 클래스를 사용하면 기본형 값의 존재 여부를 나타내고, 안전하게 처리할 수 있습니다.

 

주요 메서드와 사용법은 일반적인 Optional과 유사합니다. 다만, 값의 타입이 기본형이기 때문에 일부 메서드들이 조금 다르게 정의되어 있습니다. 예를 들면 get() 메서드 대신에 getAsInt(), getAsLong(), getAsDouble() 메서드를 사용하여 값의 반환을 처리합니다.

 

아래는 예시 코드입니다

OptionalInt optionalInt = OptionalInt.of(42);

// 값이 존재하는지 확인
boolean isPresent = optionalInt.isPresent();

// 값 가져오기
int value = optionalInt.getAsInt();

// 값이 존재하지 않을 경우 대체값 반환
int result1 = optionalInt.orElse(0);

// 값이 존재하지 않을 경우 대체값 생성
int result2 = optionalInt.orElseGet(() -> generateDefaultValue());

// 값이 존재하지 않을 경우 예외 발생
int result3 = optionalInt.orElseThrow(() -> new RuntimeException("Value not found"));

'Language > Java' 카테고리의 다른 글

Enum(열거형) 클래스  (0) 2023.06.02
스트림(Stream)  (0) 2023.05.18
리플렉션(Reflection)  (0) 2023.05.11
제네릭스<Generics>  (0) 2023.05.03
Collections Framework  (0) 2023.04.26