Java에서 null로 인한 버그를 줄이는 것은 안정적인 개발을 위한 효과적인 방법이다. 회사에서 개발하다 보면 예상치 못한 곳에서 NullPointerException이 발생하는 경우가 있다. 이런 예외 상황을 모두 생각하기는 어렵기 때문에, Java에서는 Optional이라는 클래스를 통해 null 참조로 인한 오류를 방지하고, 코드의 의도를 더욱 명확하게 표현 할 수 있도록 한다.
[Optional <T>]
Java 8부터 도입된 Optional <T> 클래스는 null 참조로 인한 오류를 방지하지만 제대로 사용하지 않으면 코드가 오히려 더 복잡해 질 수 있다.
[올바른 Optional 사용법]
Optional 은 "값이 없을 수 있음" 을 명확하게 표현 하기 위한 반환 타입으로 설계 되었다. 따라서 필드, 파라미터, 컬렉션 요소, setter 등에는 사용하지말고 오직 메서드의 반환값에서만 사용해야 한다.
아래는 주의해야 할 코드 중 10개 정도를 추려보았다.
| 피해야 할 코드 | 권장 코드 | 설명 |
| class User { Optional<String> name; } | Optional<String> findName() { ... } | 필드에 Optional X, 반환값에만 O |
| String name = opt.get(); | String name = opt.orElse("default"); | get() 직접 호출 X |
| if(opt.isPresent()) { value = opt.get(); } | value = opt.orElse("default"); | isPresent-get 대신 orElse |
| Optional.of(null); | Optional.ofNullable(null); | null이면 ofNullable |
| opt.orElse(createHeavyObject()); | opt.orElseGet(() -> createHeavyObject()); | orElse는 항상 실행됨 |
| List<Optional<User>> users; | List<User> users = Collections.emptyList(); | 컬렉션 요소에 Optional X |
| void setName(Optional<String> name); | void setName(String name); | setter에 Optional X |
| void process(Optional<String> value); | void process(String value); | 파라미터에 Optional X |
| Optional<Integer> num; | OptionalInt num; | 원시 타입엔 전용 Optional |
| Optional<Optional<String>> opt; | Optional<String> opt; | 중첩 Optional X |
아래 사이트에 더 자세하게 나와 있다.
26 Reasons Why Using Optional Correctly Is Not Optional
We take a look at the top 25 most important concepts to keep in mind when working with Optionals in Java, focusing on null variables and more.
dzone.com
'JAVA' 카테고리의 다른 글
| 바로빌을 이용한 계좌확인 API 연동 구현 - 카드사용내역 API (2) | 2024.12.18 |
|---|---|
| [자료구조] Array 와 List 의 차이 (배열과 리스트의 차이) (0) | 2024.11.27 |
| BufferedReader 와 BufferedWriter (0) | 2024.11.23 |
| Java int배열의 오름차순과 내림차순 (0) | 2024.11.21 |
| Java int 와 Integer 의 차이 (0) | 2024.11.20 |