안녕하세요
이번 시간에는 우리가 자주 사용하는 Optional에 대해서 알아보도록 하겠습니다.
1. Optional 이란?
2. Optional 특징, 주의할 점
3. Optional API
Optional 이란?
Optional 문서에 보면
null이 아닌 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너 객체입니다.
Optional은 null 값을 포함할 수 도 있고 아닐 수도 있는데
Optional를 통해서 널 여부를 판단하는게 사용의 주목적이라고 볼 수 있다.
Optional 특징
- null 값을 감싸고 있는 Wrapper Class입니다.
- null-safe한 코딩을 할 수 있도록 도와줍니다.
- 메소드 체인을 이용해 코드를 간결하게 작성할 수 있습니다.
- null 여부를 체크하며, null일 경우 NoSuchElementException을 발생시키지 않고 대신 Optional.empty()를 반환합니다.
Optional은 기본적으로 null-safe한 코딩 null 값이 생길 경우 해당 오브젝트를 처리할 수 있도록 해주는 매우 유용한 클래스입니다.
하지만 Optinal를 사용할 때 주의할 점이 있는데
- 가독성이 떨어질 수 있다.
- Optional은 기본적으로 제네릭 타입으로 사용되기 때문에 Primitive Type 값에 대해서 직접적으로 사용할 수 없다.
Optional은 기본형 값의 박싱(boxing)과 언박싱(unboxing)이 필요합니다.
예를 들어서 1을 Optional에 넣으려고 하면 Reference 타입을 넣어야 합니다.(Generic 타입이기 때문)
Primitive 타입을 Optional을 사용하려면 OptionalInt를 사용해야하고
Optional<Integer> optionalInteger = Optional.of(1);
OptionalInt optionalInt = OptionalInt.of(1);
위 코드와 같이 기본형 박싱을 수행하는 OptionalInt, OptionalLong, OptionalDouble도 있기는 합니다.
기본형 박싱은 Wrapper Class의 박싱이 아닌 직접적으로 저장하게 됩니다.
Optional API
Optional.empty(): 빈 Optional 객체를 반환합니다.
Optional.of(value): 주어진 객체를 값으로 갖는 Optional 객체를 반환합니다.
Optional.ofNullable(value): 주어진 객체가 null이 아니면 해당 객체를 값으로 갖는 Optional 객체를 반환하고, null이면 빈 Optional 객체를 반환합니다.
isPresent(): Optional 객체가 값이 있는지 확인합니다.
get(): Optional 객체의 값을 반환합니다.
orElse(other): Optional 객체의 값이 있으면 해당 값을 반환하고, 값이 없으면 other를 반환합니다.
orElseGet(Supplier other): Optional 객체의 값이 있으면 해당 값을 반환하고, 값이 없으면 other의 결과를 반환합니다.
ifPresent(Consumer action): Optional 객체의 값이 있으면 주어진 action을 수행합니다.
저는 개발하면서 Optional을 예외 처리 하는데 주로 사용하였습니다.
특히 empty API나 isPresent를 이용하면서 예외처리를 많이 해왔고
== null로 예외 처리를 하지 않고 안정적으로 예외 처리를 할 수 있다는 점을 매우 유용하게 사용했습니다.
이번 시간에는 Optional에 대해서 알아보았습니다.
매우 유용한 만큼 많이 사용하시면 좋을 것 같습니다. 감사합니다.
출처 : https://www.inflearn.com/course/the-java-java8/dashboard
더 자바, Java 8 - 인프런 | 강의
자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이
www.inflearn.com
'Java > 더 자바, Java 8' 카테고리의 다른 글
Stream 스트림 (0) | 2023.02.28 |
---|---|
Interface Default Method, Static Method 인터페이스 디폴트 메소드, 정적 메소드 (0) | 2023.02.16 |
Method Reference, 메소드 레퍼런스 (0) | 2023.02.10 |
Lambda , 람다 표현식 (0) | 2023.02.08 |
함수형 인터페이스, Functional Interface (0) | 2023.02.02 |