프로그래밍 언어/Java

[Java] equals와 == 정확히 이해하기

happy_life 2022. 6. 28. 12:47

equals에 대해 명확히 이해하기 위해선 Object을 알아야한다.

 

 

 

Object란?

모든 클래스의 조상이다. 따라서 기본적으로 모든 클래스는 Object 클래스를 상속받은 것이다.  Object 클래스에 멤버변수는 없고 클래스만 있다.

 

 

 

Object 클래스의 메서드 

 

2.1 equals(Object object)

매개변수로 객체의 참조변수를 받아 비교하여 True, False를 리턴해주는 메서드이다. 참조변수를 비교하므로 "주소값"을 비교하게 된다. 서로 다른 두 객체가 같은 주소를 갖는 일은 없다. 코드 보며 이해하자

 

코드 예제

public class IsEqualsEx {
    public static void main(String[] args) {
        Apple apple1 = new Apple();
        Apple apple2 = new Apple();

        System.out.println(apple1.equals(apple2));
        //false
        
        apple1 = apple2;

        System.out.println(apple1.equals(apple2));
        //true
    }
}

class Apple {

}

apple1 과 apple2는 다른 객체이므로 각각의 주소를 갖고 있다. 따라서 첫번째 출력에서 false가 나오게 되는 것이다. 하지만 이후 apple1 = apple2로 apple2 객체의 주소를 apple1로 넘겨주었기 때문에 apple1 또한 apple2의 객체의 주소를 가지게 된다. 따라서 두번째 출력에서 true가 나오게 되는 것이다.

 

한편, String 클래스는 equals메서드를 그대로 사용하는 것이 아니라, 오버라이딩을 통해 String 인스턴스가 같은 문자열 값을 비교하도록 되어 있다. 그래서 String 클래스는 Equal()메서드를 통해 주소값이 아닌 문자열의 내용을 비교하게 된다.

 

"==" 연산자와의 차이점

없다

Object의 equal 메서드는 this == obj에서 볼 수 있듯 == 처럼 주소값을 비교해서 return한다.

 

아래 코드를 보며 기존에 이해하지 못했던 것들을 다시 이해해보자.

 

비교 코드

public class IsEqualEx2 {
    public static void main(String[] args) {
        String string1 = new String("HelloWorld");
        String string2 = new String("HelloWorld");

        System.out.println(string1.equals(string2));
        //true
    }
}

 

string1과 string2의 주소값은 다르기에 false가 출력되야하는데 왜 true가 출력되었을까?

이 부분에 대해 반드시 이해해야 한다. 앞서 객체의 주소를 비교한다고 했고, 서로 다른 객체는 같은 주소를 가질 수 없다고 했다. 그러면 주소가 다르니 false가 return 되야 하는데 true가 return된 것이다.

 

이유

각 클래스에서 용도에 맞게 equal 메서드를 오버라이딩해서 사용하기 때문이다. 아래의 String 클래스에서 오버라이딩한 equal()을 보자

 

주소가 같아도 true를 return하고

주소가 같지 않은 경우,  String의 인스턴스라면, value를 비교해서 return 하는 것을 알 수 있다. 그렇기 때문에 true가 나오게 된 것이다. 위의 코드를 모두 이해하지 않아도, 내부적으로 오버라이딩해서 value를 비교하게 해놓았다는 것만 이해하면 된다.