[Java] - 객체비교 (eqauls)에 대해서

  eqauls() 메소드의 매개타입은 Object이다. 이것은 모든 객체가 매개값으로 대입가능하다는 것이다.

왜냐면 모든 객체의 상위 타입이 Object이기 때문이다.

 

  보통 서로 다른 객체의 비교연산자인 ==를 사용하면 객체의 메모리 주소값을 비교하게 된다.

또한 기본적으로 equals 메소드를 재정의 하지않았다면 Object에서 상속받은 기본 equals 메소드의 구현방식은

비교연산자인 == 과 동일하다.

 

그런데 만약 해당 클래스에서 equals 메소드를 오버라이딩 한 뒤, equals를 사용하면

객체의 메모리 주소를 비교하는 것이 아니라  객체가 가지고 있는 값을 비교할 수 있게 된다.

 

 우리가 정말 자주 사용하는  String 객체가 대표적인 예시로서 String 객체에 eqauls 메소드를 사용하면 객체의 메모리 주소를 비교하지않고 문자열이 같은지를 비교한다.

 

  왜냐하면 String 클래스에서는 equals() 메소드를 재정의하였기 때문이다. String 객체에서는 해당 객체의 메모리 주소값을 비교하는 것이 아닌  해당 객체의 문자열값을 비교하도록 재정의(오버라이딩)되어 있다.

 

이렇듯이 만약 본인이 작성한 클래스에 equals가 값을 비교하도록 하고자한다면 equals 메소드를 항상 재정의(오버라이딩)해주어야한다.

 

다음은 equals() 메소드를 재정의 한 Member 클래스와 재정의 하지않은 Member2 클래스를 비교한 것이다.

package Basic_API;

public class Member {
    public String id;
    
    public Member(String id) {
        this.id = id;
    }
    
}​
package Basic_API;

public class Member2 {
    public String id;
    
    public Member2(String id) {
        this.id = id;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member2) {
            Member2 member = (Member2) obj;
            if(id.equals(member.id)) {
                return true;
            }
        }
        return false;
    }
}​

 

이 두 클래스를 실행클래스에서 비교하면 다음과 같다.

package Basic_API;



public class Member_example {

    public static void main(String[] args) {
        System.out.println("---------Member 클래스------");
        Member obj1 = new Member("blue");
        Member obj2 = new Member("blue");
        
        System.out.println(obj1==obj2); // 객체의 번지를 비교하기 때문에 false
        System.out.println(obj1.equals(obj2)); // Member 클래스는 eqauls 메소드를 재정의 하지 않았기에 번지비교하기 때문에  false
        
        System.out.println("---------Member2 클래스------");
        
        Member2 obj3 = new Member2("yellow");
        Member2 obj4 = new Member2("yellow");
        
        System.out.println(obj3==obj4); // 객체의 번지비교
        System.out.println(obj3.equals(obj4)); // Member2 클래스는 eqalus 메소드를 재정의했기 때문에 문자열비교 , true반환
        
        
        System.out.println("---------Object 타입------");
        Object obj5 = new Object();
        Object obj6 = new Object();
        obj5 = "red";
        obj6 = "red";
        
        System.out.println(obj5==obj6);

    }

}
 
 

(실행결과)