기초적인 내용이지만 쉽게 혼동하는 부분이다.
일단 기초적인 설명을 하자면
Objects 클래스에는(모든 오브젝트의 조상 Object와 다르다) equals와 deepEquals 메서드가 있다.
deepEquals는 다차원 배열까지 비교할 수 있다.(내부적으로 루프를 탐)
String과 같은 각자의 객체도 equals를 갖고 있는데 왜 또 있지? 라고 생각하면,
java.util.Objects의 equals는 내부적으로 null을 확인하고 처리하는 메서드를 가지고 있다.
만약 String s1이 null인데 아래와 같은 실행을 하면 NullPointerException 이 발생할 것이다.
s1.equals(s2)
하지만 아래와 같이 쓰면 null이더라도 같은지 확인하게 된다.
Objects.equals(s1,s3)
여기까지가 배경 내용이고, 오늘의 본론으로 가보자.
본론
java api에 deepEquals를 검색해보다가 아래와 같은 문장을 보았다.
Two null values are deeply equal.
🤔 조금 헷갈린다. 그래서 좀 더 알아보았다.
아무래도 다른 객체의 equals는 null을 처리할 일이 없기 때문에 익숙치 않다.
우선 아래의 코드를 보며 이해해보자.
import java.util.Objects;
// tip: each public class is put in its own file
public class main
{
// tip: arguments are passed via the field below this editor
public static void main(String[] args)
{
System.out.println("Hello, world!");
String s1 = null;
String s2 = null;
String s3 = "hello";
System.out.println(s1); //null
System.out.println(s2); //null
System.out.println(s3); //hello
System.out.println(null==null); //true
System.out.println(s1==s2); //true
System.out.println(Objects.deepEquals(s1,s2)); //true
System.out.println(Objects.equals(s1,s2)); //true
System.out.println(Objects.isNull(s1)); //true
System.out.println(Objects.equals(s1,s3)); //false
System.out.println(s1.equals(s2)); //NullPointerException
}
}
우선 전체 코드이고,
위에서 보다 싶이
System.out.println(null==null); //true
null과 null를 직접 비교하면 true가 나온다. 혼동할 수 있으므로 잘 알아야 한다.
public static boolean deepEquals(Object a, Object b) {
if (a == b)
return true;
else if (a == null || b == null)
return false;
else
return Arrays.deepEquals0(a, b);
}
우선 이 메서드를 보면 맨 처음에 a == b 가 성립되면 바로 true를 반환하므로 양쪽 값이 모두 null일 경우 true를 반환하게 된다.
null처리가 번거로워서 Objects.equals를 사용할 때는 양쪽이 null인 경우 true를 반환시키는게 로직상 맞는지 한번 더 고려해야한다.
'JAVA > [JAVA]' 카테고리의 다른 글
[JAVA] 예외와 예외 처리(exception) (0) | 2022.11.11 |
---|---|
클래스 간의 관계 선택 팁 (0) | 2022.10.27 |
초기화 블럭 (0) | 2022.10.24 |
생성자를 이용한 인스턴스 복사 (0) | 2022.10.24 |
생성자에서 다른 생성자 호출하기 (0) | 2022.10.24 |