본문으로 바로가기

1. 문자열 길이 확인( length() )

String 클래스의 length() 메소드를 이용하여 문자열의 길이를 확인하여 비어있는 문자열인지 확인할 수 있습니다.

String test1 = "HELLO";
String test2 = "";

// 길이가 0 초과일 경우 값이 있는 것으로 판단하여 true 반환
boolean test1Check = (test1.length() > 0) ? true : false;
boolean test2Check = (test2.length() > 0) ? true : false;

System.out.println(test1Check); // true (값이 존재)
System.out.println(test2Check); // false (값이 존재하지 않음)

 

그러나 문제가 있습니다. 공백만 있는 경우에도 문자열 값이 존재한다고 판단합니다.

String test3 = "  ";
boolean test3Check = (test3.length() > 0) ? true : false;

System.out.println(test3Check); // true (공백 데이터가 있는 것도 값으로 간주)

 

따라서 trim() 메소드를 활용하여 공백을 제거해 준 후 확인할 수 있습니다.

String test3 = "  ";
boolean test3Check = (test3.trim().length() > 0) ? true : false;

System.out.println(test3Check); // false

 

2. 문자열이 비어있는지 확인( isEmpty(), isBlank() )

String 클래스의 isEmpty(), isBlack() 메소드를 활용하여 1번 예제보다 더 간단하게 확인할 수도 있습니다.

 

두 메소드 모두 문자열이 비어있는지 확인하는 메소드이며 차이는 다음과 같습니다.

public boolean isEmpty()

: 문자열의 길이가 0이면 true 아니면 false

 

public boolean isBlank()

: 문자열이 비어 있거나, 빈 공백으로만 이루어져 있으면, true를 리턴

: Java 11

 

[String 클래스]

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    public boolean isEmpty() {
        return value.length == 0;
    }
    
    public boolean isBlank() {
        return indexOfNonWhitespace() == length();
    }
}

 

[예시]

String test1 = "HELLO";
String test2 = "";
String test3 = "  ";

System.out.println("==isEmpty()==");
System.out.println(test1.isEmpty()); // false
System.out.println(test2.isEmpty()); // true
System.out.println(test3.isEmpty()); // false (길이로 체크하기 때문에 값이 있다고 판단합니다.)

System.out.println("==isBlank()==");
System.out.println(test1.isBlank()); // false
System.out.println(test2.isBlank()); // true
System.out.println(test3.isBlank()); // true

 

3. 문자열이 비어있거나 NULL인 경우 확인

위의 1번, 2번 예시를 통하여 문자열이 단순히 비어있는지는 확인할 수 있었지만 실제 실무에서는 String 클래스의 참조 변수가 Null을 참조하고 있는 상황을 자주 만나게 됩니다. 이 또한 문자열이 비어있다고 볼 수 있으므로 추가적으로 Null 확인도 필요합니다.

 

Null을 가지고 있는 String 클래스에 문자열 값이 비어있는지 length(), isEmpty(), isBlank() 메소드를 사용하게 되면 다음과 같이 NullPointerException이 발생하게 됩니다.

String test4 = null;

try {
    System.out.println(test4.isBlank());
} catch (NullPointerException e) {
    System.out.println("NullPointerException");
}

 

이를 해결하기 위하여 다음과 같이 직접 구현할 수도 있습니다.

(NULL을 참조하고 있을 경우에도 값이 비어있는 것으로 판단)

String test1 = "HELLO";
String test2 = "";
String test3 = "  ";
String test4 = null;

// null이 아니고 비어있지 않는 경우에 true
boolean test1Check = (test1 != null && !test1.isBlank()) ? true : false;
boolean test2Check = (test2 != null && !test2.isBlank()) ? true : false;
boolean test3Check = (test3 != null && !test3.isBlank()) ? true : false;
boolean test4Check = (test4 != null && !test4.isBlank()) ? true : false;

System.out.println(test1Check); // true
System.out.println(test2Check); // false
System.out.println(test3Check); // false
System.out.println(test4Check); // false (에러 발생하지 않음)

 

또는 다음과 같이 StringUtils 클래스의 hasText() 메소드를 활용하여 더 간단하게 값이 비어있는지 확인할 수도 있습니다.

(과거에는 isEmpty() 메소드를 활용하였으나 Deprecated 되어서 사용하지 않는 것을 권장합니다.)

 

[StringUtils 클래스]

public abstract class StringUtils {

    @Deprecated
    public static boolean isEmpty(@Nullable Object str) {
        return str == null || "".equals(str);
    }

    public static boolean hasText(@Nullable CharSequence str) {
        return str != null && str.length() > 0 && containsText(str);
    }

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

 

[예시]

String test1 = "HELLO";
String test2 = "";
String test3 = "  ";
String test4 = null;

System.out.println(StringUtils.hasText(test1)); // true
System.out.println(StringUtils.hasText(test2)); // false
System.out.println(StringUtils.hasText(test3)); // false
System.out.println(StringUtils.hasText(test4)); // false