본문 바로가기

Language & Framework/Java

자바 Object 클래스의 기본 메서드(1) equals()

 

equals 메서드는 자바에 입문하자마자 많이 사용해봤을 것이다.

equals 메서드의 형태는 아래와 같다.


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

 

 

 

보다시피 equals는 객체의 참조 변수를 기준으로 Boolean 값을 반환한다.

엥?? 아닌데요?? new String("aa").equals(new String("aa"))는 true인데요??

그것은 String 클래스에 equals가 오버라이드 되어있기 때문이다. 못 믿겠으면 다음 예제를 확인하자.

 

class Num {
    int num;
    Num(int num){ this.num = num; }
}
public class Equals {
    public static void main(String[] args) {
        Num num1 = new Num(10);
        Num num2 = new Num(10);
                
        System.out.println(num1.equals(num2));
    }
}
// false

 

Num num1과 Num num2의 int num은 둘 다 10이라는 값을 가지고 있지만 서로 다른 객체를 참조하고 있다.

따라서 equals 메서드를 사용해도 false를 반환한다.

그러면 String 클래스처럼 값 == 값으로 비교해서 값을 반환하게 만들 수는 없는 것일까?

당연히 가능하다.

 

class myNum {
    int num;
    myNum(int num){ this.num = num; }

    public boolean equals (Object obj) {
        if ( obj instanceof myNum ) {
        // 같은 타입일 때만 비교한다
            return this.num == ((myNum) obj).num;
        } else { return false; }
    }
    // 메서드를 실행하는 객체의 변수 값과 대상의 변수 값을 직접적으로 비교하고 있다.
}

public class Equals {
    public static void main(String[] args) {
        myNum myNum1 = new myNum(10);
        myNum myNum2 = new myNum(10);

        System.out.println(myNum1.equals(myNum2));
    }
}
// true

 

String 객체를 비교 연산할 때와 같은 방식으로 boolean 값을 리턴하고 있는 것을 확인할 수 있다.