티스토리 뷰

728x90

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 사용을 피하는 것이 좋다.

  1. 필수 값일 때: 반환값이 반드시 존재해야 한다면, Optional을 사용하는 대신 직접 값을 반환하는 것이 적합하다. 필수값인 경우 예외를 처리하는 코드를 추가하는 것이 아니라, 값이 없는 이유가 무엇인지 밝혀서 문제를 해결해야한다.
  2. 컬렉션 타입에 적용: List나 Map과 같은 컬렉션 타입 자체는 이미 값이 비어 있을 수 있다는 의미를 내포하고 있으므로, 컬렉션 타입을 Optional로 감싸는 것은 불필요한 중첩을 유발할 수 있다.
  3. 기본형 Optional은 사용하지 않기: Optional 도 기본형으로 특화 된 OptionalInt, OptionalLong, OptionalDouble 등의 클래스를 제공한다. 스트림의 경우 많은 요소를 가질 때는 기본형 특화 스트림을 이용해서 성능을 향상시킬 수 있다. 하지만 Optional의 최대 요소의 수는 한개이므로 Optional에서는 기본형 특화 클래스로 성능을 개선 할 수 없다. 또한 기본형 특화 Optional은 map, flatMap, filter 등을 지원하지 않는다. 

 

참고 

1. 모던 자바 인 액션 by 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함