java 11부터 String에 strip 메소드를 지원합니다. leading, trailing 화이트 문자들을 제거해 줍니다. Character.isWhitespace가 참인 문자들을 제거해 줍니다. 공백이라고 생각되는 문자들을 제거하지 못하는 경우도 있음에 유의하세요. 밑에서 다시 이야기 해 드리겠습니다. 이 글을 읽으시기 전에 trim 메서드에 대해서 간단하게 이해하시면 좋습니다.

 

[관련글]

trim 메서드에 대해 제대로 알아봅시다.

 


 먼저, Character.isWhitespace가 참인 codepoint를 모두 출력해 보겠습니다.

 

 

 9, 10, 11, 12, 13, ... 총 10 + 15 = 25개입니다. 이 중 코드 포인트가 32 이하인 것의 갯수는 10개입니다. 32인 것은 공백입니다.

 

 

 이제 앞쪽과 뒤쪽에 Character.isWhitespace가 참인 코드 포인트들을 오름차순으로 붙인 것을, abcdefg라는 문자열의 왼쪽과 오른쪽에 붙였습니다. 그리고 trim 메서드를 수행한 결과 문자열의 길이, strip 메서드를 수행한 결과 문자열의 길이, 그냥 원본 문자열의 길이를 출력하도록 하였습니다.

 

 

 각각 47, 7, 57이 나옵니다. 왜 그런지 보겠습니다.

 

 

 먼저 문자열은 이런 식으로 저장이 될 겁니다. 앞에 10이라고 써져 있는 네모는 코드 포인트가 32보다 작거나 같은 화이트 문자를 의미합니다. 10이라고 써 놓은 건 길이가 10이기 때문입니다. 다음에 15라고 써 놓은 것은 코드 포인트가 32보다 큰 것들이 15라는 의미입니다. 아무것도 변형을 한 게 없으면 25 x 2 + 7 = 57이 나올 겁니다.

 

 

 trim 메서드를 호출하면, 앞에 10개짜리만 무시가 될 겁니다. 뒤에 15개는 코드 포인트가 32보다 크기 때문에 정리되지 않습니다.

 

 

 String의 strip 메서드는 그렇지 않습니다. 앞에 10짜리, 뒤에 15짜리도 모두 정리할 수 있습니다. 따라서, 이 경우 7이 나옵니다.

 


 그런데 strip이 항상 만능일까요? trim보다는 많은 화이트 문자를 인식하지만, 자바 11 버전에서는 코드 포인트가 160번인 것을 화이트 문자라고 인식하지 못합니다.

 

 

 코드 포인트 160번도 사실 공백 문자입니다. 저는 test의 맨 앞에, 그리고 ori의 맨 뒤에 코드 포인트가 160번인 문자를 추가했습니다.

 

 

 1번째 줄에 공백 test가 출력됩니다. 다음에 2번째 줄부터 48, 33, 58이 출력되는데요. 왜 3번째 줄에 7이 아닌 33이 출력되었을까요? 이는 160이 자바에서는 white 문자로 인식하지 않기 때문입니다.

 

 

 ori 문자열의 길이는 50 + 7 + 1 = 58입니다.

 

 

 단순히 trim만 했을 때에는 앞의 10개만 정리될 겁니다. 그러므로, 58 - 10 = 48입니다.

 

 

 문제는 160이 자바에서는 화이트 문자로 인식하지 않기에, strip을 써도 정리가 되지 않습니다. 따라서 우측 공백 문자들도 정리되지 않고, 앞에 25개의 화이트 문자들만 사라집니다. 58 - 25 = 33입니다.