티스토리 뷰

 

 

 

Optional

 

Optional<T>는 제네릭 클래스로 T타입의 객체를 감싸는 래퍼 클래스입니다.
그렇기 때문에 Optional타입의 객체에는 모든 타입의 참조변수를 담을 수 있습니다.

 

Tip) java.util.Optional은 JDK1.8부터 추가되었습니다.

 

 

 

 

 

Optional<T>을 사용하는 이유는 뭔데?

 

Optional을 사용하는 이유에는 몇가지 경우가 있습니다.

 

  1. 값이 없는 경우에도 (null 인 경우에도) NullPointerException을 방지할 수 있습니다.
    즉, null을 직접 다루는 것은 NullPointerException을 야기할 수 있으미 조금 더 안전하게 사용하기 위해서 Optional을 사용합니다.

  2. Optional은 메서드 체이닝과 함께 사용될 때 편리합니다.
    그래서 여러작업을 수행할 수있고 map, filter등의 메서드를 사용하여 값을 변환합니다.

  3. 함수형 프로그래밍 스타일로 코딩하게 합니다.

 

 

 

 

 

Optional Java API 공식문서

 

개발자라면 공식문서는 꼭 봐야하는 것입니다!! 한번 쯤은 보는 것을 추천합니다.

JAVA17 Optional : https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Optional.html

 

Optional (Java SE 17 & JDK 17)

Type Parameters: T - the type of value public final class Optional extends Object A container object which may or may not contain a non-null value. If a value is present, isPresent() returns true. If no value is present, the object is considered empty and

docs.oracle.com

 

 

 

 

 

자주 사용하는 Optional 메서드

 

1.  Optional<T> of(T value) , ofNullable(T value)

Optional 객체를 생성합니다.
ofNullable은 of메서드 기능에서 추가로 해당 값이 null이면 그냥 비어있는 Optional 객체를 생성합니다.

Optional<String> optionalValue = Optional.ofNullable("내가 적고 싶은 문자열");

System.out.println("optionalValue : "  + optionalValue);
// 출력
// optionalValue : Optional[내가 적고 싶은 문자열]

 

 

2. T orElse(T other)

값이 존재하면 해당 값을 반환하고, 값이 없는 경우에는 지정한 기본값을 반환합니다.
첫 번째는 일반적인 값이 있는 상태이며, 두 번째는 값이 없고 null 값이 들어있는 상황입니다.

Optional<String> optionalValue = Optional.ofNullable("내가 적고 싶은 문자열");
String result = optionalValue.orElse("다른 값으로 나온다!?");

System.out.println("result : "  + result);

// 출력
// result : 내가 적고 싶은 문자열

Optional<String> optionalValue = Optional.ofNullable(null);
String result = optionalValue.orElse("다른 값으로 나온다!?");

System.out.println("result : "  + result);

// 출력
// result : 다른 값으로 나온다!?

 

 

3. Boolean isPresent()

값이 존재하는지 여부를 확인합니다.
반환형이 Boolean값이니까 조건문에 사용하면 아주 좋겠죠!?

Optional<String> optionalValue = Optional.ofNullable("내가 적고 싶은 문자열");
boolean hasValue = optionalValue.isPresent();

System.out.println("hasValue : "  + hasValue);

// 출력
// hasValue : true

 

 

4. void ifPresent(Consumer<? super T> consumer)

값이 존재할 경우 주어진 동작(Consumer 함수)을 수행합니다.
Consumer함수는 매개변수만 있고, 반환 값은 없는 함수 입니다.

 

 

Tip) ifPresent()는 Optional<T>를 반환하는 findAny()나 findFirst()와 같은 최종 연산과 잘 어울립니다.

Optional<String> optionalValue = Optional.ofNullable("내가 적고 싶은 문자열");
optionalValue.ifPresent(value -> System.out.println("Value: " + value.length()));
 
 // 출력
 // Value: 12

 

 

5. empty()

Optional을 빈 객체로 초기화 할 때 사용하게 됩니다.

Optional<String> emptyOptional = Optional.empty();

System.out.print(emptyOptional);

// 출력
// Optional.empty

 

 

 

 

 

실제로 한번 시도해보기

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class OptionalChainingExample {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 25));
        people.add(new Person("Bob", 18));
        people.add(new Person("Charlie", 30));
        people.add(new Person("David", 15));

        Optional<String> result = people.stream()
            .filter(person -> person.getAge() >= 20)
            .map(Person::getName)
            .map(String::toUpperCase)
            .reduce((name1, name2) -> name1 + ", " + name2);

        result.ifPresent(value -> System.out.println("결과: " + value));
    }
}

// 출력
// 결과: Optional[ALICE, CHARLIE]

 

 

 

 

 

성능을 올리는 방법

 

Optional<T>를 보면 T에서 모든 타입의 참조변수를 넣을 수 있다.

그럼 Interger나 Long 같은 래퍼타입이 올 수 있지 않겠나? int, long 같은 기본형이 있는데.....

이렇게 되면 기본형인 int에 값을 넣어 줄라고 하면 언박싱이 일어나기 때문에 리소스낭비가 되기 때문에 성능을 저하시킵니다.

그 해결법으로 애초에 int형, long형에 담아주는 Optional이 있습니다. 같이 알아보도록 하죠!

 

 

Tip) 오토 박싱 : 기본형(int) → 래퍼 클래스(Integer)      ,      언박싱 : 래퍼 클래스(Integer) → 기본형(int)

 

 

Optional 클래스 반환형 값을 반환하는 메서드
Optional<T> T get()
OptionalInt int getAsInt()
OptionalLong long getAsLong()
OptionalDouble double getAsDouble()
// 사용 예시
OptionalInt customOptional = OptionalInt.of(42);

 

 

Optional은 중요하고 자주 사용되니 잘 알아 두시기 바랍니다.!!

 

 

 

감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함