✔️ Optional이란?
- Java8에서 추가된 클래스
- NullPointerException을 방지하고, null-safe하게 코드를 작성할 수 있도록 도와준다.
더보기
⚠️ NullPointerException(NPE)이란?
값이 없는(null) 객체의 메서드나 필드에 접근할 때 발생하는 런타임 예외
프로젝트 중 브라우저에서 받아온 Map 객체에서 값을 꺼내 사용하려다 값이 존재하지 않는 key에 접근하면서 NullPointerException이 발생 😓
이를 해결하기 위해 Optional을 적용했고,.orElse, .ifPresent 등을 활용해 문제를 해결했다.
⚪ Optioanl 객체 생성하기
.empty()
Optioanl.empty()
- 비어 있는 Optional 객체 생성
.of(arg)
Optioanl.of("Hello")
- null이 아닌 값을 담은 Optional 생성 → null이면 예외 발생
.ofNullable(arg)
Optioanl.ofNullable(arg)
- null이거나 아닐 수 있는 값을 담은 Optional 생성
⚪ Optioanl 메서드
.map(Function)
public String getCityOfMemberFromOrder(Order order) {
return Optional.ofNullable(order)
.map(Order::getMember)
.map(Member::getAddress)
.map(Address::getCity)
.orElseThrow(IllegalStateException::new);
}
- 값이 존재하면 변환 함수를 적용
- 체이닝 방식으로 깊이 있게 객체 접근 가능
.isPresent()
Boolean exist = Optioanl.isPresent();
- 값이 존재하는지 확인할 수 있음
- 최근에는 .ifPresent() 또는 .orElse() 사용이 더 권장됨
.ifPresent()
optioanl.ifPresent((val) -> {
// 값이 있을 때 동작 수행
System.Out.println("값 존재 " + val);
})
- Optional 객체 내부에 값이 있다면, 콜백함수가 실행
- 실제로 이걸 사용해서 map 안에 객체가 있을 때만 동작을 실행하게끔 함
.orElse(value)
optional.orElse("DEFAULT");
- 값이 존재하면 그 값 사용
- 없으면 인자로 전달된 기본값 반환
.orElseGet(() -> {})
Optional<User> user1 = userRepository.findById(1L);
User user = user1.orElseGet(() -> {
Optional<User> user2 = userRepository.findById(2L);
return user2.get();
});
- Optional 객체 내부에 값이 있으면, 그 값을 return하고,
- 비어 있다면 인자로 넘어온 함수를 실행한다.
- 인자로 넘어온 함수에서도 null이 반환되면 NullPointerException이 발생한다.
- orElse와 달리 실제로 필요할 때만 함수 실행함 (성능 측면에서 더 유리)
.orElseThrow()
User user = optional.orElseThrow(() -> {
return new IllegalArgumentException("error");
});
- Optional 객체 내부가 비어 있으면 예외를 던진다.
'JAVA > STUDY' 카테고리의 다른 글
[Java] Enum 열거형 타입 (0) | 2024.08.09 |
---|---|
[JAVA] 멀티 스레드(1) (2) | 2024.02.15 |
[JAVA] 배열 (Array) (2) | 2024.02.14 |
[JAVA] 조건문과 반복문(if, switch, for, while문) (3) | 2024.02.12 |
[JAVA] 자바 변수, 선언, 초기화 (2) | 2024.02.12 |