자바 Equals

greenTea·2023년 4월 24일
0

Equals

equals는 보통 값을 비교하고 hashcodehash값을 비교하는 것으로 알고 있을 것이다.

그러면 아래 코드의 결과는 어떻게 나올까?

Person객체 비교

public class Test {

    public static void main(String[] args) {
        Person person1 = new Person(1,"A");
        Person person2 = new Person(1,"A");
        System.out.println("==비교") ;
        System.out.println(person1 == person2);
        System.out.println("equals비교" );
        System.out.println(person1.equals(person2));
    }

    static class Person {
        public int age;
        public String name;

        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    }
}

결과는 아래와 같이 둘 다 false이다.

🤔Equals는 값 비교라고 했는데 위와 같은 결과가 나온 이유는 뭐지???

그러면 이번에는 String으로 비교를 해보면

public class Test3 {

    public static void main(String[] args) {
       
        String a1 = new String("abc");
        String a2 = new String("abc");
        System.out.println("==비교") ;
        System.out.println(a1 == a2);
        System.out.println("equals비교" );
        System.out.println(a1.equals(a2));
    }
 }

new String 비교

String의 equals

위와 같은 결과가 나온 이유는 직접 String 객체를 들어가면 알 수 있다.

위와 같이 재정의를 통해서 ==으로 주소가 달라도 값이 같으면 true를 반환하도록 되어 있다.

🤔그러면 처음에 보았던 equals를 다시 재정의 해보면 값이 어떻게 나올까?

Person 재정의

static class Person {
        public int age;
        public String name;

        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Person person = (Person) o;
            return age == person.age && Objects.equals(name, person.name);
        }

        @Override
        public int hashCode() {
            return Objects.hash(age, name);
        }
    }

결과

이제는 우리가 생각한대로 결과가 나왔다.

😊우리가 알고 있는 많은(거의 대부분의)객체들은 equals를 재정의하여 사용하고 있는데 이를 통해 값이 같다면 true를 반환하도록 설계되어 있다.

profile
greenTea입니다.

0개의 댓글