본문 바로가기

수업 & 공부/용어 정리

54 : [Java] Optional 이란? (추가예정)

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]

출처: https://homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/

'수업 & 공부 > 용어 정리' 카테고리의 다른 글

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