본문 바로가기
Java·Servlet·JSP

JAVA에서 String을 Null Safe하게 비교하기

by Leica 2021. 8. 14.
반응형

 

Nullable한 두 개의 String이 equal한지를 null safe하게 비교하는 방법을 알아보자.

 

String#equals

두 String이 null이 아니면 String 클래스의 인스턴스 메소드 equals를 사용하면 된다.

@Test
void test0() {

    String s1 = "hello";
    String s2 = "hello";

    assertThat(s1.equals(s2)).isTrue();

    s2 = "world";

    assertThat(s1.equals(s2)).isFalse();
}

 

@Test
void test1() {

    String s1 = null;
    String s2 = null;

    assertThatThrownBy(() -> s1.equals(s2)).isInstanceOf(NullPointerException.class);
}

이렇게 s1이 null이면 당연히 NullPointerException이 발생한다.

 

@Test
void test2() {

    String s1 = "hello";
    String s2 = null;

    assertThat(s2 instanceof String).isFalse();
    assertThat(s1.equals(s2)).isFalse();
}

s2가 null이면 Exception은 발생하지 않는다. 단 s2가 String instance가 아니기 때문에 s1와 s2를 ==로 비교한 결과를 리턴한다.

 

자 그러면 다시 주제로 돌아와서, nullable한 두 개의 String의 equality 비교를 어떻게 null safe하게 할 수 있을까?

 

java.util.Objects.equals(Object, Object)

이를 위해 Java 7부터 java.util.Objects의 static 메소드 equals(Object, Object)를 사용할 수 있다.

이 메소드는 둘 다 null이면 true를, 둘 중 하나가 null이면 false를, 그렇지 않으면 equals의 결과를 리턴한다.

@Test
void test3() {

    assertThat(Objects.equals(null, null)).isTrue();
    assertThat(Objects.equals("hello", null)).isFalse();
    assertThat(Objects.equals(null, "world")).isFalse();
    assertThat(Objects.equals("hello", "hello")).isTrue();
    assertThat(Objects.equals("hello", "world")).isFalse();
}

 

nullable한 객체에서 메소드를 호출하는게 아니라 static 메소드이므로 NullPointerException의 발생 가능성이 없고 별도의 라이브러리를 추가할 필요가 없다는 장점이 있다.

 

Apache Commons

다른 방법으로는 apache commons 라이브러리의 StringUtils가 제공하는 static 메소드 equals()를 사용할 수 있다.

 

@Test
void test4() {

    assertThat(StringUtils.equals(null, null)).isTrue();
    assertThat(StringUtils.equals("hello", null)).isFalse();
    assertThat(StringUtils.equals(null, "world")).isFalse();
    assertThat(StringUtils.equals("hello", "hello")).isTrue();
    assertThat(StringUtils.equals("hello", "world")).isFalse();
}

 

이를 사용하려면 apache commons 라이브러리 의존성을 추가해야한다.

 

참고

https://stackoverflow.com/questions/11271554/compare-two-objects-in-java-with-possible-null-values/11271611

https://www.baeldung.com/java-compare-strings

 

반응형

댓글