더 자바, Java 8
Optional
카테고리 : 더 자바, Java 8
Optional
Optional 소개
- 자바 프로그래밍에서 null 체크를 깜빡해서 NullPointerException을 종종 본다.
메소드에서 작업 중 특별한 상황에서 값을 제대로 리턴할 수 없는 경우 선택할 수 있는 방법
- 예외를 던진다.
- 스택트레이스를 찍어서 비싸다.
- null 을 리턴한다.
- 비용 문제는 없지만 크 코드를 사용하는 클라이언트 코드가 주의해야 한다.
- Optional 을 리턴한다.
- 자바 8 부터
- 클라이언트 코드에게 명시적으로 빈 값일 수도 있다는 걸 알려주고, 빈 값인 경우에 대한 처리를 강제한다.
Optional
- 오직 값 한 개가 들어있을 수도 없을 수도 있는 컨테이너
- 주의할 것
- 리턴값으로만 쓰기를 권장한다.
- 메소드 매개변수 타입, 맵의 키 타입, 인스턴스 필드 타입으로 쓰지 말자.
- 매개변수 타입 : Optional는 이유가 없어진다, 오히려 null 체크를 한번 더해야한다 - 파라미터로 null 보내는게 가능해서 NullPointException 이 발생한다(위험하다)
- 맵의 키 타입 : 맵이라는 인터페이스가 가지고 있는 인터페이스의 특징을 깨트린다. (KEY는 NULL 이 아니다)
- 인스턴스 필드 타입 : 설계의 문제다 - 차라리 클래스를 쪼개던가 , 벨리데이션 을 사용하자
- 메소드 매개변수 타입, 맵의 키 타입, 인스턴스 필드 타입으로 쓰지 말자.
- Optional을 리턴하는 메소드에서 null을 리턴하지 말자
- 다른 개발자의 혼란을 초래한다. - NullPointException 발생
- Optional.empty() 를 사용하자.
- 프리미티브 타입용 Optional 은 따로 있다.
- OptionalInt
- OptionalLong
- 프리미티브 타입용 Optional 을 사용하지 않고 그냥 Optional 사용할 경우 안에서 박싱 언박싱이 벌어진다 그래서 성능에 안 좋다.
- Collection, Map, Stream Array, Optional 은 Optional 로 감싸지 말것
- 비어있다는 것을 표현할 수 있는 타입들이다.
- 리턴값으로만 쓰기를 권장한다.
- 기존
- 에러를 만들기 좋은 코드, null 체크를 잊을 수 있다.
- null return 하는 자체가 문제.
- 에러를 던진다.
- 스택트레이스를 찍어서 비싸다.
- Checked Exception 을 던질때는 예외처리를 강제한다.
Test test = new Test(1, test)
TestInObject testInObject = test.getTestInObject();
if( testInObject != null ) {
System.out.println(testInObject.getTest());
}
- java8 이후
class test{
public Optional<TestInObject> getTestInObject() {
return Optional.ofNullable(testInObject);
}
}
참고
- https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
- https://www.oracle.com/technical-resources/articles/java/java8-optional.html
Optional API
Optional 만들기
- Optional.of()
- Optional.ofNullable()
- Optional.empty()
Optional 에 값이 있는지 없는지 확인하기
- isPresent()
- isEmpty() (java11 부터 제공)
Optional 에 있는 값 가져오기
- get()
Optional 에 값이 있는 경우 그 값을 가지고 ???를 해라.
- ifPresent()
Optional 에 값이 있으면 가져오고 없는 경우에 ???를 리턴해라.
- orElse()
- Optional 에 값이 있어도 ??? 를 실행한다.
Optional 에 값이 있으면 가져오고 없는 경우 ???를 해라.
- orElseGet()
- Optional 에 값이 있으면 ??? 를 실행 안 한다.
Optional 에 값이 있으면 가져오고 없는 경우 에러를 던져라
- orElseThrow()
Optional 에 들어 있는 값 걸러 내기
- Optional filter(Predicate)
Optional 에 들어있는 값 변환하기
- Optional map(Function)
- Optional flatMap(Function) : Optional 안에 들어있는 인스턴스가 Optional 인 경우에 사용하면 편리하다.