티스토리 뷰
Null의 문제점
Java에서 null은 매우 오랜 시간 동안 객체가 없음을 나타내는 대표적인 방법이었다. 하지만 이 null이 시스템 전반에 걸쳐 여러 문제를 일으킬 수 있다.
1. NullPointerException (NPE)
프로그램에서 객체가 null인 상태에서 그 객체에 접근하려 할 때, NPE가 발생하며 이는 개발자들이 자주 마주하는 에러 중에 하나이다.
String name = null;
System.out.println(name.length()); // NullPointerException 발생
2. 코드 가독성 저하
null 처리를 위해 코드 전반에 if문을 사용해야하며 가독성이 떨어진다.
if (user != null && user.getName() != null) {
System.out.println(user.getName());
}
3. 명시적이지 않은 의미
null은 데이터가 없는 상태를 표현하기는 하지만, 왜 데이터가 없는지를 명확히 전달하지 않는다. 예를 들어, 반환 값이 null일 때 그것이 잘못된 입력 때문인지, 단순히 값이 없기 때문인지 알기 어렵다.
4. 자바 철학을 위배
자바는 개발자로 부터 모든 포인터를 숨겼는데, 그 예외가 Null pointer이다.
그래서 Optional? Optional이 뭔데?
Optional<T> 는 값이 있을 수도, 없을 수도 있는 객체를 감싸는 컨테이너 클래스로, Optional을 사용하면 개발자가 명시적으로 값이 있는지 없는지를 확인할 수 있고, 더 나은 코드 가독성을 제공 할 수 있다.
1. 안전한 Null 처리
Optional을 사용하면 값을 처리할 때 null 여부를 확실히 체크할 수 있으므로, NPE의 발생 가능성을 줄일 수 있다. 값이 있으면 Optional 클래스는 값을 감싸고, 값이 없으면 Optional.empty로 Optional을 반환한다. Optional.empty()는 객체이므로, 이를 다양한 방식으로 활용 할 수 있다.
2. 더 나은 코드 가독성
null 체크를 위한 반복적인 코드를 줄일 수 있고, 함수형 프로그래밍 스타일을 지원하는 다양한 메서드(map, filter, flatMap 등)를 사용할 수 있어 코드가 더 읽기 쉬워진다.
Optional<User> optionalUser = Optional.ofNullable(user);
optionalUser.map(User::getName)
.ifPresent(System.out::println);
3. 의도 명시
메서드 반환 값으로 Optional을 사용함으로써, 메서드가 값을 반환하지 않을 수도 있다는 사실을 명시적으로 전달할 수 있다.
public Optional<String> getUserName(User user) {
return Optional.ofNullable(user.getName());
}
Optional 사용시 주의 할 점
Optional을 무조건 남발하는 것도 좋은 방법은 아니며, 다음과 같은 경우에는 Optional 사용을 피하는 것이 좋다.
- 필수 값일 때: 반환값이 반드시 존재해야 한다면, Optional을 사용하는 대신 직접 값을 반환하는 것이 적합하다. 필수값인 경우 예외를 처리하는 코드를 추가하는 것이 아니라, 값이 없는 이유가 무엇인지 밝혀서 문제를 해결해야한다.
- 컬렉션 타입에 적용: List나 Map과 같은 컬렉션 타입 자체는 이미 값이 비어 있을 수 있다는 의미를 내포하고 있으므로, 컬렉션 타입을 Optional로 감싸는 것은 불필요한 중첩을 유발할 수 있다.
- 기본형 Optional은 사용하지 않기: Optional 도 기본형으로 특화 된 OptionalInt, OptionalLong, OptionalDouble 등의 클래스를 제공한다. 스트림의 경우 많은 요소를 가질 때는 기본형 특화 스트림을 이용해서 성능을 향상시킬 수 있다. 하지만 Optional의 최대 요소의 수는 한개이므로 Optional에서는 기본형 특화 클래스로 성능을 개선 할 수 없다. 또한 기본형 특화 Optional은 map, flatMap, filter 등을 지원하지 않는다.
참고
1. 모던 자바 인 액션 by 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트
'백엔드 > java' 카테고리의 다른 글
[java] 소켓 통신 시 데이터가 제대로 오지 않는다?! / 엔디안 / 빅엔디안 / 리틀엔디안 / ByteBuffer (1) | 2024.09.18 |
---|---|
[java] 신뢰할 수 없는 인증서(사설인증서)를 사용 할 수 있도록 jvm 설정하기/PKIX path building failed (0) | 2024.06.10 |
[자바] 객체를 더 객체답게 사용하기 - 상속(Inheritance) (1) | 2023.12.26 |
[java/자바] try-with-resource 구문 / 자원 자동 반납 (0) | 2023.08.03 |
[java/자바] 익명내부 클래스를 람다식으로 변경하기 (0) | 2023.07.25 |
- Total
- Today
- Yesterday
- centos
- 도커
- 코테
- Kubernetes
- java 코테
- javascript
- 리액트
- tomcat
- Docker
- java
- softeer
- 현대코테
- 코딩테스트
- 아파치카프카
- 오토에버코테
- 현대
- Linux
- react
- mysql
- 자바스크립트
- 자바코테
- springboot
- 쿠버네티스
- 스프링
- 전자정부프레임워크
- 톰캣
- 자바
- 현대오토에버
- Spring
- softeer java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |