equals, hashCode 및 테스트의 isEqualTo

song yuheon·2023년 9월 22일
1

Spring

목록 보기
86/93
post-thumbnail

ArrayList와 동등성 equals, hashCode 및 테스트의 isEqualTo


1. ArrayList의 equals 메서드

Java의 ArrayList 클래스는 equals 메서드를 재정의하여 인스턴스의 내용 기반으로 리스트를 비교한다.
즉 두 ArrayList 객체가 동일한 순서와 동일한 요소를 포함하고 있다면 equals 메서드는 true를 반환한다.

List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");

List<String> list2 = new ArrayList<>();
list2.add("A");
list2.add("B");

System.out.println(list1.equals(list2));  // true

list1list2는 서로 다른 참조를 갖지만 내용은 동일하므로 equals 메서드의 결과는 true이다.


2. 사용자 정의 객체와 equals


Java에서 객체의 equals 메서드는 참조를 비교한다.
따라서 사용자 정의 객체에서 내용 기반의 동등성 비교를 원한다면 equals를 재정의해야 한다.

public class Person {
    private String name;
    private int age;
}

이 클래스의 인스턴스 두 개를 생성하고 비교해보면

Person person1 = new Person("p1", 25);
Person person2 = new Person("p1", 25);

System.out.println(person1.equals(person2));  // false

두 객체의 내용은 동일하나 equals 메서드의 결과는 false이다.
이는 Person 클래스가 equals를 재정의하지 않았기 때문이다.


3. equals와 hashCode 재정의


equals를 재정의할 때는 항상 hashCode도 함께 재정의해야 한당.
그렇지 않으면 객체를 해쉬 기반의 컬렉션에 저장할 때 문제가 발생할 수 있다.

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

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

이렇게 equalshashCode를 재정의하면 Person 클래스의 인스턴스는 내용 기반으로 비교된다.


4. 테스트에서의 isEqualTo


테스트 작성 시 AssertJ 라이브러리를 사용한다면 isEqualTo 메서드로 두 객체의 동등성을 비교할 수 있다.
이 메서드는 내부적으로 객체의 equals 메서드를 사용하여 두 객체를 비교한다.

List<String> expected = new ArrayList<>();
assertThat(result).isEqualTo(expected);

이 코드는 resultexpected 리스트의 내용이 동일한지 비교한다.
ArrayList는 이미 equals 메서드를 적절히 재정의하고 있기 때문에 내용 기반으로 비교된다.


profile
backend_Devloper

0개의 댓글