1. Question

Java에서 값이 없는 상황(null)을 처리하는 방법은?

2. Answer

Java에서 null 값은 값이 없음을 나타내며, 이를 잘못 다루면 NullPointerException이 발생하여 프로그램의 안정성을 해칠 수 있다. 이러한 문제를 해결하기 위해 다양한 방법이 있으며, 이를 통해 예기치 않은 에러를 방지하고 코드의 가독성 및 유지보수성을 향상시킬 수 있다.

A. 전통적인 null 확인

public String getUsername(User user) {
  if (user != null) {
    return user.getName();
  } else {
    return "No name";
  }
}

이 코드는 User 객체가 null인지 확인하고, null이 아니라면 사용자 이름을 반환하며, null이면 “No name”을 반환한다. 이 방법은 단순하지만, 객체의 속성에 접근하거나 메서드를 호출할 때마다 반복적으로 null 검사를 해야 하므로 코드가 복잡해질 수 있다.

B. Optional 클래스 사용

Java 8이상에서는 Optional 클래스를 사용하여 null을 보다 우아하게 처리할 수 있다. Optional은 값이 있거나 없을 수 있는 컨테이너 객체로, null 체크를 명시적으로 하지 않고도 NullPointerException을 방지할 수 있게 해준다.

public String getUsername(Optional<User> user) {
  return user.map(User::getName).orElse("No name");
}

이 코드는 Optional을 사용하여 User 객체의 존재 여부를 판단하고, User 객체가 존재한다면 그의 이름을 반환하며, 존재하지 않는다면 “No name”을 반환한다. 이 방식은 코드를 간결하게 만들고, null을 직접 다루는 것보다 안전하게 값을 처리할 수 있게 해준다.

3. Detail

A. null 사용의 문제점

  • 에러의 근원이다: NullPointerException은 자바에서 가장 흔히 발생하는 에러다.

  • 코드를 어지럽힌다: 때로는 중첩된 null 확인 코드를 추가해야 하므로, null 때문에 코드 가독성이 떨어진다.

  • 아무 의미가 없다: null은 아무 의미도 표현하지 않는다. 특히 정적 형식 언어에서 값이 없음을 표현하는 방법으로는 적절하지 않다.

  • 자바 철학에 위배된다: 자바는 개발자로부터 모든 포인터를 숨겼다. 하지만 예외가 있는데 그것이 바로 null 포인터다.

  • 형식 시스템에 구멍을 만든다: null은 무형식이며 정보를 포함하고 있지 않으므로, 모든 참조 형식에 null을 할당할 수 있다. 이런 식으로 null이 할당되기 시작하면서 시스템의 다른 부분으로 null이 퍼졌을 때 애초에 null이 어떤 의미로 사용되었는지 알 수 없다.

B. Optional 클래스 세부 설명

[Java] Optional 클래스란? [Java] Optional 클래스 사용 방법은? [Java] Optional을 사용한 실용 예제에는 어떤 것들이 있는가?

4. Reference

  • “모던 자바 인 액션” (저자: 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트)

태그:

카테고리:

업데이트:

댓글남기기