1. Optional이란?
Optional<T> 클래스를 사용해 NPE를 방지할 수 있도록 도와준다. Optional<T>는 null이 올 수 있는 값을 감싸는
Wrapper 클래스로, 참조하더라도 NPE가 발생하지 않도록 도와준다. 클래스이기 때문에 각종 메소드를 제공해준다
- null인지 아닌지 체크하는 분기문이 없어서 가독성이 좋다
- 명시적으로 해당 변수가 null일 수도 있다는 가능성을 표현할 수 있다
NPE : 많이 발생되는 예외 중 하나 NullPointerException
메서드가 반환할 결과값이 ‘없음’을 명백하게 표현할 필요가 있고, null을 반환하면 에러를 유발할 가능성이
높은 상황에서 메서드의 반환 타입으로 Optional을 사용하자는 것이 Optional을 만든 주된 목적이다
1. isPresent() 대신 orElse() 사용
// 아래코드를
Optional<Board> board = boardRepository.findBoardById(id);
if (board.isPresent()) {
return board.get();
} else {
return null;
}
// 줄이려면 orElse 사용
Optional<Board> board = boardRepository.findBoardById(id);
return board.orElse(null);
isPresent()는 null체크를 해주는 메소드이다
2. orElse(new A) 대신 orElseGet(() -> new A)
orElse(A)에서 A는 Optional에 값이 있든 없든 무조건 실행된다. 따라서 A가 새로운 객체를 생성하거나
새로운 연산을 수행하는 경우에는 orElse() 대신 orElseGet()을 써야한다.
// 안 좋음
Optional<Member> member = ...;
return member.orElse(new Member()); // member에 값이 있든 없든 new Member()는 무조건 실행됨
// 좋은 예
Optional<Member> member = ...;
return member.orElseGet(Member::new); // member에 값이 없을 때만 new Member()가 실행됨
orElseGet(B)에서 B는 Optional에 값이 없을 때만 실행된다. 따라서 Optional에 값이 없을 때만
새 객체를 생성하거나 새 연산을 수행하므로 불필요한 오버헤드가 없다.
https://onduway.tistory.com/85 여기 블로그에 이해하기 쉽게 정리되어있다.
출처: https://mangkyu.tistory.com/70 [MangKyu's Diary]
'수업 & 공부 > 용어 정리' 카테고리의 다른 글
57 : @Transactional (0) | 2021.10.27 |
---|---|
52 : @Entity, @Builder, @GeneratedValue (0) | 2021.10.25 |
48 : REST API (2) (0) | 2021.10.13 |
46 : 제네릭 (Generics) (0) | 2021.10.11 |
39 : Springboot (Rest API - @PathVariable ) (0) | 2021.09.30 |