티스토리 뷰
Optional
Optional<T>는 제네릭 클래스로 T타입의 객체를 감싸는 래퍼 클래스입니다.
그렇기 때문에 Optional타입의 객체에는 모든 타입의 참조변수를 담을 수 있습니다.
Tip) java.util.Optional은 JDK1.8부터 추가되었습니다.
Optional<T>을 사용하는 이유는 뭔데?
Optional을 사용하는 이유에는 몇가지 경우가 있습니다.
- 값이 없는 경우에도 (null 인 경우에도) NullPointerException을 방지할 수 있습니다.
즉, null을 직접 다루는 것은 NullPointerException을 야기할 수 있으미 조금 더 안전하게 사용하기 위해서 Optional을 사용합니다. - Optional은 메서드 체이닝과 함께 사용될 때 편리합니다.
그래서 여러작업을 수행할 수있고 map, filter등의 메서드를 사용하여 값을 변환합니다. - 함수형 프로그래밍 스타일로 코딩하게 합니다.
Optional Java API 공식문서
개발자라면 공식문서는 꼭 봐야하는 것입니다!! 한번 쯤은 보는 것을 추천합니다.
JAVA17 Optional : https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Optional.html
자주 사용하는 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은 중요하고 자주 사용되니 잘 알아 두시기 바랍니다.!!
감사합니다.
'프로그래밍 언어 > 💫JAVA' 카테고리의 다른 글
[JAVA] 멀티쓰레드와 쓰레드 풀 : 동시 프로그래밍의 핵심 (0) | 2024.02.14 |
---|---|
[JAVA] URL : 네트워크 통신과 리소스 접근을 위한 핵심 클래스 (0) | 2023.12.28 |
[JAVA] Stream 스트림 : 코드에 스마트함을 부여하여 개발을 한 단계 업그레이드하자! (0) | 2023.11.22 |
[JAVA] Comparator 비교 : 데이터 정렬을 우리가 바꾸는 방법은? (0) | 2023.11.15 |
[JAVA] Enum 열거 : 코드의 가독성을 높이는 효과적인 선택 (0) | 2023.11.09 |
- Total
- Today
- Yesterday
- java
- 코딩테스트
- JavaScript
- git
- 프로세스
- 개발
- Mac
- 개발블로그
- aws
- 프론트
- 자바스크립트
- 오라클
- Fetch
- 네트워크
- Cors
- Front
- 디자인패턴
- 비동기
- 템플릿
- spring
- AJAX
- Spring Security
- 개발자
- 개발환경
- 데이터 베이스
- DBeaver
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |