본문 바로가기

Java

Optional<T>

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