Optional이란?
- Optioanl는 null 값이 가능한 T타입의 객체를 감싸는 Wrapper 클래스로, NPE(Null Point Exception)이 발생하지 않도록 해준다.
- Optional은 데이터를 Wrapping하고 Null일 경우 처리하는 함수 등의 오버헤드가 있으므로 Nullable한 값이 아니라면 사용하지 않는 것이 낫다.
Optioanl의 장/단점
장점
- 명시적으로 변수에 대한 null 가능성을 표현할 수 있음
- null 체크를 직접하지 않아도 됨
- Null Point Exception이 발생할 가능성이 있는 값을 직접 다룰 필요가 없음
단점
- Wrapper 클래스이기 때문에 두 개의 참조를 가지므로 오버헤드가 존재
- 직렬화(Serialize)가 불가능하기 때문에 클래스의 인스턴스 필드로 사용하면 안됨
- 필드로 사용하도록 고안된 것이 아니기 때문에 값을 반환하는 용도로 사용해야 함
Optional 객체 생성
1. Optional<String> optEmpty = Optional.empty();
2. Optional<String> optNotNull = Optional.of("test")
3. Optioanl<String> optNullable = Optional.ofNullable(myService.getId());
orElse(), orElseGet(), orElseThrow()
- orElse() : 값이 존재하면 값을 반환, 값이 없는 경우 인수로 전달된 값을 반환
- orElseGet() : 값이 존재하면 값을 반환, 값이 없는 경우 파라미터로 전달된 함수형 인터페이스 (함수)의 결과를 반환
- orElseThrow() : 값이 존재하면 값을 반환, 값이 없는 경우 인수로 전달된 Exception을 발생
orElse() 와 orElseGet() 차이점
-
orElse()는 값의 존재 유무와 관계 없이, 인수로 함수가 전달된 경우 함수가 반드시 실행 됨.
-
orElseGet()은 값이 없을 경우에만 인수로 전달된 함수가 실행 됨
-
대부분의 경우 orElseGet()을 사용하는 것이 좋다.
orElse() | orElseGet() |
---|
파라미터로 값을 필요 | 파라미터로 함수(함수형 인터페이스)를 필요 |
값이 미리 존재하는 경우 사용 | 값이 미리 존재하지 않는 경우 사용 |
Optional을 올바르게 사용하는 방법
Optional 사용 Method
<참고 URL>