JAVA (SPRING)

[JAVA] ObjectUtils, CollectionUtils

박현국 2025. 3. 6. 17:36
1. ObjectUtils
  • 주 용도:
    • 객체와 관련된 여러 공통 작업을 수행합니다.
    • 예를 들어, null인 경우 기본값 제공(defaultIfNull), 두 객체의 비교, 해시 코드 생성, toString 변환 등.
  • 사용 상황:
    • 단순한 null 체크 이상의 로직이 필요할 때.
    • 예를 들어, "값이 null이면 기본값을 반환"하는 로직을 구현할 때 ObjectUtils.defaultIfNull(obj, defaultValue)를 사용할 수 있습니다.
  • 라이브러리:
    • Apache Commons Lang (또는 Spring에서도 유사한 ObjectUtils가 있음).

 

2. CollectionUtils
  • 주 용도:
    • Collection(리스트, 셋 등)과 관련된 작업을 수행합니다.
    • 예를 들어, 컬렉션이 null이거나 비어있는지 검사(isEmpty, isNotEmpty), 합집합, 교집합 등의 집합 연산 등.
  • 사용 상황:
    • 컬렉션의 유효성(예: null 혹은 비어있음) 확인, 또는 컬렉션 간의 연산이 필요할 때.
    • null 체크를 별도로 하지 않고, 한번에 "컬렉션이 null이거나 empty면 true"라고 판별할 수 있어 편리합니다.
  • 라이브러리:
    • Apache Commons Collections, Spring Framework의 CollectionUtils 등에서 제공.

 

3. java.util.Objects (예: Objects.nonNull, requireNonNull)
  • 주 용도:
    • JDK에서 제공하는 기본 유틸리티 클래스.
    • Objects.nonNull(obj)는 boolean 값을 반환하여 null이 아님을 판별할 때 사용하거나, Stream의 필터로 활용.
    • Objects.requireNonNull(obj)는 객체가 null이면 NullPointerException을 던져서 빠르게 문제를 확인할 수 있도록 해줍니다.
  • 사용 상황:
    • 간단한 null 체크가 필요할 때.
    • 예를 들어, 메서드 인자가 null이면 예외를 발생시키고 싶을 때 Objects.requireNonNull(param, "param must not be null")를 사용할 수 있습니다.
    • Stream 처리 시 filter(Objects::nonNull)과 같이 사용할 수 있습니다.

 

어떤 것을 선택할까?
  • 단순 null 검사:
    • JDK의 Objects.nonNull 또는 Objects.requireNonNull을 사용하는 것이 가볍고 직관적입니다.
  • 기본값 반환 등 부가 기능 필요:
    • Apache Commons Lang의 ObjectUtils.defaultIfNull() 같이 더 다양한 기능을 제공하는 메서드를 사용할 수 있습니다.
  • 컬렉션의 유효성 검사:
    • 컬렉션이 null이거나 empty인지 한 번에 검사할 때는 Spring이나 Apache Commons의 CollectionUtils.isEmpty(collection) 같은 메서드가 유용합니다.
  • 기타:
    • 문자열 처리는 Apache Commons Lang의 StringUtils를, 배열 처리는 ArrayUtils 등을 사용할 수 있습니다.
    • 또, Guava의 Preconditions나 Apache Commons Validate 등도 유효성 검사에 많이 사용됩니다.

결국 어떤 도구를 쓸지는 상황에 따라 다릅니다.

  • JDK 표준 메서드들은 별도의 라이브러리 의존성이 없고, 단순한 작업에는 충분합니다.
  • 반면, 보다 복잡한 처리나 편의 기능이 필요하다면 Apache Commons나 Spring의 유틸리티 클래스를 사용하는 것이 좋습니다.

좋지 않은 코드 예)

1. null 이 아니고 비어있지 않은 경우를 체크하기 위해

if (TestList != null && TestList.size() > 0) { ... }

 

2. List 가 비어있는지 확인하기 위해

if (!TestList.isEmpty()) { ... }    

 

 

좋은 코드 예)

null check 와 empty 를 동시에 확인하려면 CollectionUtils.isEmpty 와 같은 메서드를 사용하자!

//AS-IS
       if (TestList == null || TestList.isEmpty()) { ... }

//TO-BE
       if (CollectionUtils.isEmpty(TestList)) { ... }

 

시간 복잡도

 

  • Objects.nonNull(obj):
    단순히 obj != null을 검사하므로 O(1)입니다.
  • Objects.requireNonNull(obj):
    null 체크 후, null이 아니면 그대로 반환하거나 null이면 예외를 던지므로 O(1)입니다.
  • ObjectUtils.defaultIfNull(obj, defaultValue):
    obj가 null인지 검사하고, null이면 기본값을 반환하는 단순 연산이므로 O(1)입니다.
  • CollectionUtils.isEmpty(collection):
    컬렉션이 null인지 또는 empty 인지를 검사합니다.
    대부분의 Collection 구현체(예: ArrayList, HashSet 등)는 isEmpty()가 O(1)로 구현되어 있어 전체적으로 O(1)입니다.
  • List.size():
    O(N)