[Java] "".equals(null) (equals 메서드)
String.equals(Object obj) 메서드는
내부적으로 매개변수가 null일 경우 false를 반환한다.
null.equals("")는 예외를 발생시키지만,
"".equals(null)은 안전하게 false를 반환!!
(equals메서드 내부로직)
@Override
public boolean equals(Object anObject) {
if (this == anObject) { // 같은 객체인지 확인
return true;
}
if (anObject instanceof String) { // anObject가 String 타입인지 확인
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) { // 길이가 같은지 확인
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { // 문자열 비교
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
1) "".equals(null)
인자로 받은 anObject가 null이면, instanceof 연산에서 false가 반환되므로 바로 return false;
즉, 예외 없이 바로 false를 반환.
2) null.equals("")
변수.equals("") 에서 변수가 null인 경우,
null이 equals메서드를 호출하려 하기 때문에 NullPointerException 발생.
( equals는 인스턴스 메서드, 앞의 객체(호출하는 객체)가 존재해야 호출 가능. )
따라서 "".equals(변수) 형태는 변수가 null이어도 안전하게 비교할 수 있기 때문에
예외를 방지하는 용도로 사용!!
Objects.equals(a, b)
=> 내부적으로 null 체크 + equals 호출
(Objects.equals() 메서드 내부로직)
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
1) a == b → 동일한 객체인지 먼저 확인
2) a != null → null 체크 수행
3) a.equals(b) → 실제 equals 비교
* import java.util.Objects; 필요
(equals 메소드는 기본 제공 메서드라 별도의 import 필요없음)
따라서, 문자열 비교는 "".equals(str) 형식을 사용하는게 더 효율적!
( 큰 성능차이는 없지만 불필요한 과정 생략이나 가독성 측면에서 )
문자열 비교는 "".equals(str),
객체 비교는 Objects.equals(a, b)