- Optional 사용에 대한 고민2024년 01월 21일 23시 17분 04초에 업로드 된 글입니다.작성자: jCurve728x90반응형
java에서 optional은 null이 아닌 값을 포함하거나 포함하지 않는 container object인데
값이 있으면 isPresent()같은 멤버 메서드를 통해 값이 존재할 경우 값을 return 받는 등의 방식으로 사용할 수 있다.- empty() : 값이 없다는 것을 표현하기 위한 optional
- of(): non-null value에 대한 표현을 위한 optional(null일시 NPE)
- ofNullable(): null일수도 있는 value에 대한 표현을 위한 optional
이러한 optional를 사용하는 것에 대한 비용이 발생하는 것도 무시하지 못하기 때문에 어느 상황에서 사용할지에 대해 고민이된다.
풀고자 하는 문제가 무엇인가?
optional은 자바 에서 NPE를 감소시키기 위한 시도임
좀 더 API의 표현력을 올려서 때때로 값이 없음을 반환하는 것에 대한 표현력
풀고자 하는 문제가 아닌것은?
모든 타입의 null pointer들을 피하기 위한 메커니즘을 의미하는 것이 아니다.
메소드 및 생성자의 필수 입력 매개변수는 여전히 테스트를 해야하고null을 사용하는 것과 같은 의미로 Optional을 값이 없다는 의미를 표현하기 위해 사용하는것은 도움이 되지 않는다.
단순히 null이 값이 없다는 것 외에 값을 찾을 수 없다 등의 의미로 사용할 수 있으므로 선택적으로 값이 없을 수 있기 때문. --> 이럴 경우 메소드 호출자는 처리를 위해 누락된 Optional의 의미를 확인하기 위해 결국 메소드 doc를 확인해야함, 그리고 호출자가 그냥 get()을 호출해서 처리를 진행하는 것을 물리적으로 막을수도 없음.그래서 언제 사용해야될까?
Optional의 의도된 사용은 주로 return type이다.
type에 대한 인스턴스를 얻은 후 존재한다면 값을 추출하거나 존재하지 않다면 대안이 되는 행위를 제공할 수 있다.
라이브러리 메서드가 반환할 결과값이없음
을 명백하게 표현할 필요가 있는 곳에서 제한적으로 사용할 수 있는 메커니즘을 제공하는 것이 Optional을 만든 의도임언제 사용하지 말까?
직렬화가 불가능하므로 클래스의 필드로 사용하지 말 것.
불필요하게 복잡한 코드를 만들 수 있으므로 생성자 및 메서드의 매개 변수로 사용하지 말 것.
> 하지만 호출되는 쪽 , api나 라이브러리 메서드에서 인자가 optional이든 아니든 null체크를 하는 것이 안전하다 따라서 optional을 인자로 사용하지 말고 호출되는 쪽에 null 체크 책임을 남겨두자.
optional 생성에 대한 비용기 발생하기 때문에 단지 값을 얻을 목적이라면 null 비교를 쓸 것.
컬렉션의 경우는 빈 컬렉션을 반환하는 것이 좋을때가 많다 그래서 굳이 컬렉션을 optional로 감싸서 반환하지 말고 비어있는 컬렉션을 반환할 것.
Optional에 담기는 값이 int, long, double등이라면 boxing/unboxing이 발생하는Optional<?>
말고 OptionalInt , OptinalLong을 사용할 것.반응형'JAVA' 카테고리의 다른 글
java exception performance (0) 2024.01.14 BigDecimal 정리 (0) 2024.01.07 Java Functional하게 사용하기 - 5 (0) 2022.02.17 Java Functional하게 사용하기 - 4 (0) 2022.02.17 Java Functional하게 사용하기 - 3 (0) 2022.02.12 댓글