리팩토링 - 객체의 null 체크시 == 연산자를 직접 사용하는게 좋은가?

LJH·2021년 12월 9일
2

1. 리팩토링 전

if (Objects.isNull(Object)){
		...
}

if (Object == null){
		...
}
  • == 연산자를 이용한 방법과, Objects.isNull() 을 이용한 방법 두 가지를 혼용해서
    사용하고 있었다.

  • 둘이 어떤 차이가 있고 어떤 방법이 베스트 프랙티스일지 생각해보자.


2. null 체크 비교

  • String은 아래에서 따로 정리한다.

2-1. == 연산자

if (Object == null){
		...
}
  • 설명할게 없다. 해당 객체가 null인지 판단한다.

2-2. Objcets.isNull()

  • 내부 코드를 보면 == 연산자를 사용한다.

  • 그럼 == 연산자isNull()은 무슨차이일까?

    • API Note를 잘 읽어보면 "이 메소드는 java.util.function.Predicate, filter(Objects::nonNull)로 사용하기 위해 존재합니다." 라고 명시되어 있다.

    • 단순히 Null 체크를 위한 메서드가 아니다. Null 체크를 위한 용도로 사용한다면
      API를 만든 목적에 맞지 않는다.

2-3. ObjectUtils.isEmpty()

  • 마찬가지로 == 연산자를 이용해 null 체크를 한다.

  • 추가로 특정 타입인지 검사하는 로직이 들어있다.

  • 무엇보다 큰 단점은 가독성이 좋지 않다 라고 생각한다. 만약 처음 본 사람이 IsEmpty() 라는 이름이 null인지 검사를 해주겠구나! 라고 생각하지 않을 것 이다.


3. String의 null 체크

  • 우선 String s1 = null, String s2 = ""; 일 때 s1,s2는 전혀 다른 값을 가진다.
    즉 null과 빈 문자열은 다르다는 말이다.

3-1. String.isEmpty()

  • 문자열의 길이를 검사한다. 즉 null 체크가 아닌 String이 빈 문자열인지 검사한다.

3-2. String.isBlank()

  • 마찬가지이다. null체크를 하는것이 아닌 String이 빈 문자열인지 검사한다.

3-3. StringUtils.isEmpty()

  • 이 메서드는 5.3부터 Deprecated 되었다.

3-4. StringUtils.hasText()

  • str ≠ null

    • null인지 아닌지 판단
  • !str.isEmpty()

    • 빈 문자열인지 즉 “” 형태 값인지 아닌지 판단
  • containsText(strt)

    • 문자열의 길이가 0보다크고, 공백으로만 이루어져 있어도 false를 리턴한다.
  • 즉 null이 아니고, 빈문자열도 아니며, 공백으로만 이루어져 있는 문자열도 아닌 문자열인 경우에만 true를 retrun해준다. 단순 null체크를 넘어서 유효한 문자열인지 검사해주는 메서드이다.


4. 결론

  • Object의
    isNull(), isEmpty() 모두 내부적으로 == 연산자를 사용한다.
    isNull()은 null 체크를 위해 만든 메서드가 아니며,
    isEmpty()는 null을 검사하는 것인지 명확하지 않다.

  • 위에 있는 String의 세 메서드는 null체크를 하지 않는다.

따라서 나는 null 체크할 때 == 연산자를 직접 사용하는 것을 지향하려고 한다.
String 타입인 경우에는 StringUtils.hasText() 사용을 지향하고자 한다.

  • 추가로 이는 스스로 내린 결정은 아니며, 여러 사람에게 질문해서 얻은 답변들과, 관련 메서드들의 코드들을 보고 내린 결론이다. 사내 코드도 참고했다.

  • 왜인지 모르겠지만 평소에 나는 == 연산자를 사용한 null체크가 좋지 못한 코드라고 생각하고 있었다. 그래서 이를 리팩토링하고자 관련 메서드들의 코드들을 보고, 사람들에게도 물어봤는데 잘못된 생각이란걸 깨달았다.

0개의 댓글