Home > Java > Java > ☕️[Java] Optional

☕️[Java] Optional
Java Programming Language Backend

☕️[Java] Optional.

1️⃣ Optional.

  • Optional은 Java 8에서 도입된 클래스이며, 주로 null 값을 안전하게 처리하기 위해 사용됩니다.
  • Optional은 값이 존재할 수도 있고 존재하지 않을 수도 있는 상황을 표현하는 컨테이너 역할을 하며, null을 직접 사용하는 것보다 안전하고 명시적인 방법을 제공합니다.

2️⃣ 주요 특징

  • 1. 값의 존재 여부를 명확히 표현.
    • Optional은 값이 존재하는 경우(Optional이 비어있지 않음)와 값이 존재하지 않는 경우(Optional이 비어있음)를 명확하게 표현합니다.
      • 이를 통해 null 참조로 인해 발생할 수 있는 오류를 예방할 수 있습니다.
  • 2. 명시적인 null 처리.
    • Optional을 사용하면 값이 없을 때 취할 행동을 명시적으로 정의할 수 있습니다.
      • 이로 인해 코드가 더 읽기 쉬워지고, NullPointerException을 피할 수 있습니다.
  • 3. 함수형 프로그래밍 스타일 지원.
    • Optional은 다양한 메서드(map, flatMap, filter, ifPresent, orElse 등)를 제공하여 값의 존재 여부에 따라 함수형 프로그래밍 스타일로 작업을 수행할 수 있습니다.

3️⃣ Optional 생성.

Optional<String> emptyOptional = Optional.empty();
  • Optional 생성 : Optional.empty()를 사용하여 비어 있는 Optional을 생성할 수 있습니다.
Optional<String> nonEmptyOptional = Optional.of("Hello");
  • null이 아닌 값으로 Optional 생성.
    • Optional.of()를 사용하여 null이 아닌 값으로 Optional을 생성할 수 있습니다.
    • 값이 null인 경우 NullPointerException이 발생합니다.
Optional<String> nullableOptional = Optional.ofNullable(null);
  • null이 될 수 있는 값으로 Optional 생성.
    • Optional.ofNullable()을 사용하여 값이 null일 수도 있는 경우 Optional을 생성할 수 있습니다.
    • 값이 null이면 빈 Optional이 생성됩니다.
      Optional<String> nullableOptional = Optional.ofNullable(null);
      

4️⃣ Optional의 사용 예

  • 1. 값이 존재하는지 확인(isPresent / ifPresent)
    ```java
    Optional optional = Optional.of("Hello");

if (optional.isPresent()) {
System.out.println(optional.get()); // 값이 있으면 출력
}

optional.ifPresent(value -> System.out.println(value)); // 값이 있으면 람다 표현식 실행


- **2. 값이 없을 때 대체 값 제공(`orElse`, `orElseGet`)**
```java
String result = optional.orElse("Default Value"); // 값이 없으면 "Defaul Value"
String result = optional.orElseGet(() -> "Default Value from Supplier"); // 람다로 대체 값 제공
  • 3. 값이 없으면 예외 던지기(orElseThrow)
    String result = optional.orElseThrow(() -> new IllegalArgumentException("No value present"));
    
  • 4. 값 변환(map, flatMap)
    ```java
    Optional optional = Optional.of("Hello");

Optional lengthOptional = optional.map(String::length); lengthOptional.ifPresent(length -> System.out.println("Length: " + length));


- **5. 조건에 따른 필터링(`filter`)**
```java
Optional<String> optional = Optional.of("Hello");

Optional<String> filtered = optional.filter(value.startsWith("H"));
filtered.ifPresent(System.out::println); // "Hello" 출력

5️⃣ Optional 사용의 이점.

  • 1. 명시적 코드 작성.
    • Optional을 사용하면 코드에서 값이 존재할 수 있는지 여부를 명시적으로 다루게 되어 가독성이 높아집니다.
  • 2. NullPointerException 방지.
    • Optionalnull 체크를 강제하여 NullPointerException 발생을 예방합니다.
  • 3. 함수형 스타일.
    • Optional은 함수형 프로그래밍 스타일을 지원하여 간결하고 선언적인 코드를 작성할 수 있게 합니다.

6️⃣ Optional 사용 시 주의점.

  • 1. 과도한 사용 자제.
    • 모든 상황에서 Optional을 사용하는 것은 오히려 복잡성을 초래할 수 있습니다.
      • 예를 들어, 필드에 Optional을 사용하거나, 매우 단순한 로직에 Optional을 사용하는 것은 바람직하지 않을 수 있습니다.
  • 2. 성능.
    • Optional은 추가적인 객체를 생성하므로, 성능이 중요한 곳에서는 주의해서 사용해야 합니다.

7️⃣ 요약.

  • Optionalnull을 안전하게 처리하기 위한 클래스이며, 값이 있을 수도 있고 없을 수도 있는 상황을 명시적으로 표현할 수 있게 해줍니다.
  • Optional을 통해 코드의 가독성을 높이고, NullPointerException을 방지할 수 있습니다.
  • Optional은 함수형 프로그래밍 스타일을 지원하여 코드 작성의 유연성을 제공합니다.