JAVA

isBlank() vs isEmpty()

개발자성장기 2025. 2. 28. 15:53
반응형




출석 미션을 하다가 페어가 물어봤다.

"isBlank()과 isEmpty()의 차이가 뭐야?"

나는 그냥 단순히 blank는 스페이스 같은 임의의 공백도 다 잡아내고 isEmpty는 아무것도 입력하지 않으면 true라고 했는데 

내가 생각해도 너무 대충 알고 있는 것 같아 제대로 공부할 필요성을 느꼈다.  

사실 지금까지 대강 알고 해왔다는 것에 반성했다.  

 

자 그럼 이제부터 자세히 알아보자!!

 

 

1. isEmpty() 

문자열의 길이가 0이면 `ture`를 반환한다.

내부적으로 `isEmpty()`는 `String`객체의 텍스트를 나타내는 바이트 배열의 길이에 의존한다.  

 

실제로 코드를 보면 바이트 배열의 길이에 의존한다

 

게다가 `isEmpty()`메서드는 텍스트가 비어 있는지 아닌지를 계산하기 위해 모든 유형의 문자를 계산한다. 

따라서 빈 공백, 표, 줄바꿈 또는 바이트로 표현할 수 있는 모든 문자는 유효한 문자로 계산된다.  

String str1 = "";
System.out.println(str1.isEmpty()); // true

 

❗️주의 : 공백 문자(스페이스, 탭 등)가 포함되어 있으면 길이가 0이 아니기 때문에 `false`를 반환한다.

@Test
public void givenString_whenCallIsEmpty_thenReturnCorrectValues() {
    assertFalse("Example text".isEmpty()); // false
    assertTrue("".isEmpty());  // true
    assertFalse("  ".isEmpty());  // false
    assertFalse("\t\n\r\f".isEmpty()); // false
}

 

 

2. isBlank() 

자바 11부터 추가된 메서드입니다.  

문자열이 비어있거나, 오직 공백 문자(스페이스, 탭, 줄바꿈 등)로만 이루어져 있으면 true를 반환한다.

자바에서 공백 문자로 간주되는 5개 문자는 \s(공백)와 \t, \n, \r, \f 이스케이프 시퀀스이다.

 

isBlank는 이렇게 생겼다.
indexOfNonWhitespace()는 이렇게 구현돼있다.

 

 

  • `isLatin1()` : 문자열이 Latin-1(ISO-8859-1) 인코딩인지 확인하는 메서드
  • `value` : String 클래스 내부에서 문자열 데이터를 저장하는 필드
  • `StringLatin1.indexOfNonWhitespace(value)` : Latin-1 문자열에서 공백이 아닌 첫 번째 문자의 인덱스 반환
  • `StringUTF16.indexOfNonWhitespace(value)` : UTF-16 문자열에서 공백이 아닌 첫 번째 문자의 인덱스 반환

 

❓ isBlank() 동작 원리

  1. `indexOfNonWhitespace()`가 문자열에서 처음으로 공백이 아닌 문자의 위치를 찾음
    • Latin1 문자열이면 `StringLatin1.indexOfNonWhitespace(value)` 실행
    • UTF-16 문자열이면 `StringUTF16.indexOfNonWhitespace(value)` 실행
  2. 이 값이 `length()`와 같다면 → 문자열이 공백 문자만 포함 또는 빈 문자열
  3. 따라서 `isBlank()`는 문자열이 비어 있거나 공백 문자만 포함된 경우 true를 반환

 

백그라운드에서 `isBlanck()`메서드는 첫 번째 비공백 문자의 인덱스를 검색한다. 

비공백 문자가 없으면 해당 인덱스는 배열의 길이와 같다. 

마지막으로 해당 인덱스를 바이트 배열의 길이와 비교하여 정답을 출력한다.  

@Test
public void givenString_whenCallStringIsBlank_thenReturnCorrectValues() {
    assertFalse("Example text".isBlank()); // // false
    assertTrue("".isBlank());    // true
    assertTrue("  ".isBlank()); // true
    assertTrue("\t\n\r\f ".isBlank()); //true
	assertTrue(" hi ".isBlank());   // false
}

첫 번째 줄은 적어도 하나의 공백이 아닌 문자를 포함하고 있기 때문에 공백이 아닌 것으로 간주\

 

 

✅ 정리

isBlank()는 일부 이스케이프 시퀀스와 같은 공백 문자에 대해 `true`를 반환하고 `isEmpty()`는 문자열에 문자가 하나도 없을 때만 `ture`를 반환합니다.

 

 

 

📚 Reference

- https://www.baeldung.com/java-string-isempty-vs-isblank

반응형