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://www.baeldung.com/java-compare-strings
'Java·Servlet·JSP' 카테고리의 다른 글
[JAVA] Class 클래스를 이용해 메소드와 생성자 얻기 (0) | 2023.02.12 |
---|---|
[JAVA] Arrays.asList()와 List.of()의 차이 (0) | 2023.02.10 |
JAVA 제네릭(Generics) 클래스와 메소드 (1) | 2020.07.11 |
JAVA의 객체 직렬화(Serialization)와 JSON 직렬화 (0) | 2020.07.10 |
자바 Object 클래스 정리 - toString(), equals(), hashCode(), clone() (0) | 2020.06.30 |
댓글