JAVA/STUDY

[Java] Optional 사용

코맹 2025. 4. 10. 10:13

✔️ 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