상세 컨텐츠

본문 제목

문자열(String)의 빈 값 혹은 Null을 다루는 여러가지 방법

Development/Java

by thisisnew 2019. 10. 19. 00:34

본문

반응형

 

자바에서 문자열의 빈 값("")과 Null을 다루는 방법은 여러 가지가 존재합니다.

 

먼저, 문자열의 빈 값과 null을 다룰 때 아래와 같은 코드를 자주 만나게 되는데요.

boolean checkString(String str) {
  return str == null || str.equals("");
}

하지만 이 방법은 equals()가 내부적으로 가지는 여러 로직에 의해 기능적으로 낭비일 수 있습니다.

 

그래서 여기서는 3가지 방법을 소개하려고 합니다.


1. 자바 6보다 낮은 버전이라면 length()를 활용해보시기 바랍니다.

아래의 코드를 봐주시기 바랍니다.

//equals()

public boolean equals(Object anObject) {
  if (this == anObject) {
	return true;
  }
  if (anObject instanceof String) {
 	String anotherString = (String)anObject;
	int n = count;
	if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
       		while (n-- != 0) {
				if (v1[i++] != v2[j++])
				return false;
			}
		return true;
	}
  }
  return false;
}
//length()

public int length() {
  return count;
}

 

length()는 길이만 계산하여 반환하는 것에 반해, equals()는 내부적으로 복잡한 로직이 존재하는 것을 볼 수 있습니다.

 

length()의 사용 방법은 다음과 같습니다. 

boolean checkString(String str) {
  return str == null || str.length() == 0;
}

 

문자열이 빈 값이면 true를 반환합니다.

 

단, 여기서 문제가 있는데요.

 

바로 문자열이 스페이스바를 이용하여 입력한 whitespace("  ")인 경우입니다.

 

그럴 때는 아래와 같이 trim()을 이용하여 공백을 제거 후 사용하시면 됩니다. 

boolean checkString(String str) {
  return str == null || str.trim().length() == 0;
}

 

2. 자바 6 이상이라면 isEmpty()를 사용해보시기 바랍니다.

메서드명이 좀 더 직관적이죠?

 

설명을 보면 다음과 같습니다.

1번의 length()를 이용한 방법과 동일한 원리임을 알 수 있습니다.

 

사용 방법은 다음과 같습니다. 

boolean checkString(String str) {
  return str == null || str.isEmpty();
}

문자열이 빈 값("") 일 경우 true를 리턴합니다. 

 

하지만 isEmpty()를 이용할 경우에도 whitespace("  ")경우에 문제가 생길 수 있는데요.

 

이번에도 아래와 같이 trim()을 이용하여 공백을 제거 후 사용하시면 됩니다. 

boolean checkString(String str) {
  return str == null || str.trim().isEmpty();
}

 

3. 자바 11 이상이라면 isBlank()를 사용해보시기 바랍니다.

1번 방법과 2번 방법 모두, 고질적인 whitespace("  ")의 문제가 있었는데요.

 

isBlank()를 활용하는 것도 하나의 방법이 될 수 있습니다.

 

설명을 보면 문자열이 빈 값이거나 whitespace인 경우에는 true를 반환한다고 되어 있습니다.

 

사용 방법은 다음과 같습니다.

boolean checkString(String str) {
  return str == null || str.isBlank();
}

 

 

4. 라이브러리를 추가하여 StringUtils를 활용하는 것을 추천드립니다.

StringUtils아파치 커먼즈(Apache Commons)의 라이브러리인데요.

 

스프링을 사용하신다면 다음과 같이 추가해주시면 됩니다.

<!--MAVEN-->

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
</dependency>
<!--GRADLE-->

compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'

StringUtils의 빈 값을 처리하는 메서드는 2가지가 있는데요.

 

바로 isEmpty()와 isBlank()입니다.

 

사용 방법은 각각 다음과 같습니다.

//isEmpty()

boolean checkString(String str) {
  return StringUtils.isEmpty(str);
}
//isBlank()

boolean checkString(String str) {
  return StringUtils.isBlank(str);
}

 

문자열이  빈 값("") 일 경우 true를 반환합니다.

하지만 whitespace("  ")의 처리에서는 다른데요.

 

isEmpty()는 false를, isBlank()는 true를 반환합니다. 이 점을  주의하셔서 사용하시면 될 것 같습니다.

 

하지만 두 가지의 방법 모두 공통적으로 지닌 강점이 있는데요.

 

바로 NullPointerException을 발생시키지 않는다는 점입니다.

 

위에서 제시한 1~3번 모두 문자열의 null처리를 추가로 작성해줬었죠?

 

하지만 StringUtils를 이용하면 그럴 필요가 없습니다.


StringUtils는 이 외에도 문자열을 처리하는 다양한 메서드를 제공합니다.

 

아래의 문서를 참고하여 이용해 보는 것도 좋을 것 같습니다.

 

참고 : https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

 

StringUtils (Apache Commons Lang 3.9 API)

Splits a String by Character type as returned by java.lang.Character.getType(char). Groups of contiguous characters of the same type are returned as complete tokens, with the following exception: the character of type Character.UPPERCASE_LETTER, if any, im

commons.apache.org

 

반응형

관련글 더보기

댓글 영역