Java/공부공부

[Java] "".equals(null) (equals 메서드)

phyho 2025. 3. 26. 22:12

 

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)