IT/Spring | Java

[Spring] 객체와 String 문자열 null 체크 (==, isEmpty, hasText)

힞뚜루마뚜루 2023. 5. 22. 11:55
728x90

 

1.  String 타입 null 체크

문자열 데이터의 유효성을 체크하기 위해 다음과 같은 방법을 사용할 수 있다.
여기서 유효성은 데이터가 빈 문자열 또는 null 인지 확인한다.

 

equals() 와 == 연산자

if("".equals(map.get("stringData")) || map.get("stringData") == null) {
		...
}

"".equals(비교데이터)를 통해 해당 값이 빈 값인가,  비교데이터 == null을 통해 해당 값이 null인가를 판단할 수 있다.
이 때, (비교데이터).equals("") 방식은 exception이 발생할 수 있기 때문에 불가하다.

더보기

여기서 자세히 설명하면,  equals()는 실제 값을 비교하고 == 연산자는 두 개의 주소값을 비교한다.

String str1 = '어쩌고';
String str2 = str1;
String str3 = new String('어쩌고');


str1.equals(str2)  //true
str1 == str2       //true
str2.equals(str3)  //true
str2 == str3      //false

 

  • str1.equals(str2) 
    : 동일한 문자열이므로 true
  • str1 == str2
    : 같은 주소값을 가르키므로 true
  • str2.equals(str3) 
    : 동일한 문자열이므로 true
  • str2 == str3
    : str3은 엄연히 다른 객체이므로 다른 주소값을 가진다. 따라서 false

 

StringUtils.hasText()

StringUtils는 Spring Framework 에서 제공하는 여러 유용한 유틸 중 문자열 관련 유틸이다.

public static boolean hasText(@Nullable String str) {
    return str != null && !str.isEmpty() && containsText(str);
}

private static boolean containsText(CharSequence str) {
    int strLen = str.length();
    
    for(int i = 0; i < strLen; ++i) {
      if (!Character.isWhitespace(str.charAt(i))) {
        return true;
      }
    }
    
    return false;
}

내부 로직은 위와 같은데, 공백(whitespace) 까지 체크해주는 것을 볼 수 있다.

즉,

  • str 이 null 인가
  • str이 빈 문자열 ("")인가
  • str이 공백으로만(whitespace) 이루어져 있는가

를 체크해서 모두 해당되지 않을 때 True를 반환한다.

StringUtils.hasText("")  //false
StringUtils.hasText("어쩌고")  //true

 

 

StringUtils.isEmpty()

사실 isEmpty() 라는 메서드가 존재한다. 내부 로직은 첫번째로 설명한 [equals()와 '=='] 와 같다.

하지만 얘는 Spring 5.3.9 버전부터 deprecated 되어 지원하지 않으니 권장하지 않는다.

 

String 타입의 null 체크를 위해 StringUtils.hasText() 사용을 권장한다.

 

2. 객체 Object null 체크

== 연산자

if(Object == null) {
		...
}

너무 쉽죵

 

ObjectUtils.isEmpty()

String과 마찬가지로 Object를 위한 유틸도 있다. (사실 나는 이걸 잘 사용하지 않는다.)

구조를 살펴보면 다음과 같다.

public class ObjectUtils {

    public static boolean isEmpty(Object s) {
        if (s == null) {
            return true;
        }
        if ((s instanceof String) && (((String)s).trim().length() == 0)) {
            return true;
        }
        if (s instanceof Map) {
            return ((Map<?, ?>)s).isEmpty();
        }
        if (s instanceof List) {
            return ((List<?>)s).isEmpty();
        }
        if (s instanceof Object[]) {
            return (((Object[])s).length == 0);
        }
        return false;
    }
}

 

 

728x90