반응형

자바의 최상위 클래스인 Object 클래스에는 여러가지 native 메서드가 존재하는데

그 중 equals()에 대해 알아보고자 한다.

 

1. equals() 란?

Object 클래스에서는 단순히 "동일한" 객체인지 비교. (동일성)

public boolean equals(Object obj) {
    return (this == obj);
}

equals() 는 보통 하위 클래스에서 재정의하여 사용하는데, 보통 "동등성"을 비교.

 

대표적인 예시로, String 클래스의 equals() 들 수 있다.

String의 equals()는 문자열을 비교하기 위해, 해당 문자열의 "내용"을 비교하도록 재정의 되어있다.

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof 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;
}

 

2. == 연산자와의 차이점

"==" 연산자는 primitive type에 대해서는 값을 비교, reference type에 대해서는 주소값을 비교한다.

사실 primitive type에서도 Constant Pool에 있는 특정 상수값을 참조하는 것이기 때문에, 결국 주소값을

비교하는 연산자라고 볼 수 있다.

 

Object의 equals()와 동일한 기능을 하고 있다고 볼 수 도 있다.

다만 == 연산자의 경우 재정의하여 사용하지 않고, 오직 동일성 비교를 위해서 사용된다고 보면된다.

 

다음 예제로 == 연산자와 String 클래스의 equals() 메서드를 비교해보자.

public class Main {
    public static void main(String[] args) {
        String str1 = "apple";
        String str2 = new String("apple");

        System.out.println(str1.equals(str2)); // true
        System.out.println(str1 == str2); // false
    }
}

 

내부 값 자체를 비교하도록 재정의 되어있는 String 클래스의 equals() 같은 경우,

리터럴 방식으로 선언된 str1과 new로 선언된 str2의 주소값이 다르더라도, 같은 문자열이기 때문에 true가 반환된다.

 

== 연산자의 경우, str1과 str2의 주소값 자체를 비교하므로 false를 반환하게 된다.

+ Recent posts