Optional<T> 는 T타입의 객체를 감싸는 래퍼 클래스이다. 모든 타입의 참조변수를 담을 수 있다.
Optional객체에 담아서 반환하면 반환결과가 null인지 체크할 필요 없이 정의된 메서드를 통해 처리할 수 있다.
Optional 객체 생성
Optional 객체를 생성할 때는 of() 또는 ofNullable()를 사용한다.
public Optional<Member> findById(Long id){
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
참조변수의 값이 null일 가능성이 있으면 ofNullable()를 사용해야한다(of 사용시 NullPointerException발생)
// 빈 객체로 초기화
Optional<String> optional = Optional.empty();
기본값으로 초기화시 null 도 가능하지만, 이게 더 바람직함.
Optional 객체의 값 가져오기
String s1 = optional.get(); // 저장되어있는 값을 반환(null이면 예외발생)
String s2 = optional.orElse("");// 저장되어 있는 값이 null일때 ""를 반환한다.(null이던말던 항상불린다)
String s3 = optional.orElseGet(String::new); // () -> new String()과 동일 (null일때만 불린다)
String s4 = optional.orElseThrow(NullPointerException::new);// null이면 지정된 예외발생을 시킨다
주의: orElse의 매개변수가 메소드인 경우 Optional 인자가 null이 아니어도 그냥 실행된다.
public String getName(){
System.out.println("getName실행");
return "";
}
// 빈 객체로 초기화
Optional<String> optional = Optional.of("test1");
String s1 = optional.get(); // 저장되어있는 값을 반환(null이면 예외발생)
String s2 = optional.orElse(getName());// (null이던말던 항상불린다)
String s3 = optional.orElseGet(String::new); // () -> new String()과 동일 (null일때만 불린다)
String s4 = optional.orElseThrow(NullPointerException::new);// null이면 지정된 예외발생을 시킨다
System.out.println("s4을 출력합니다");
System.out.println(s4);
진짜 그냥 실행된다. 장애나기 딱 좋음.
orElse와 orElseGet의 성능차이가 크지 않으므로 대부분 orElseGet을 사용하는 것이 좋겠다.
orElseThrow는 SpringData JPA와 활용도가 좋다.
public User findById(Long userId){
return userRepository.findById(userId)
.orElseThrow(()-> new IllegalArgumentException("Unexpected user"));
}
이런식으로 사용할 수 있다.
Spring Data JPA로 orElse 문법 사용시 null 이 아닐 경우 내부적으로 Optional의 value를 가져오도록 구현되어있다는데, Entity 객체로 받을수 있다고 한다. 나중에 확인해보자
'Java' 카테고리의 다른 글
정렬할때 쓰기 좋은 메소드 (0) | 2024.02.15 |
---|---|
문자열과 String 클래스 (0) | 2024.01.05 |
TreeMap (0) | 2023.10.25 |
Stream<String>에서 String으로 변환하기 (0) | 2023.10.04 |
커스텀 어노테이션 (0) | 2023.09.20 |