본문 바로가기
자바

[자바] Lombok 의 @EqualAndHashCode

by kdohyeon (김대니) 2023. 2. 11.
반응형

회사 업무를 하면서 @EqualsAndHashCode 어노테이션을 자주 목격했다. 대충은 .equals() 와 .hashCode() 코드를 만들어주는가보다 생각했는데, 정확하지 못해서 한번 정리는 해야겠다고 생각했었다. 그래서 알아보니 .equals().hashCode() 부터 이해해야 했고, 여기에서 정리를 한번 했다. 이제 @EqualsAndHashCode 에 대해 알아보도록 하자.

Lombok 이 제공하는 @EqualAndHashCode

공식 사이트에서 정의하는 @EqualAndHashCode 는 다음과 같다.

Equality made easy: Generates hashCode and equals implementations from the fields of your object.

객체 비교를 쉽게 하기 위해 객체의 .equals().hashCode() 코드를 생성해준다는 것인데, 객체의 필드를 모두 고려해 논리적으로 객체의 동등 비교를 할 수 있게 해준다.

예시를 통해 알아보자

상품 클래스에는 상품명과 상품 설명을 담을 수 있는 필드가 존재한다. 두 객체를 만들고 .equals() 로 동등 비교를 해보자.

class Product {
    private String productName;
    private String productDescription;

    public Product(String productName, String productDescription) {
        this.productName = productName;
        this.productDescription = productDescription;
    }
}

@Test
void test() {
    Product p1 = new Product("모니터", "27인치");
    Product p2 = new Product("모니터", "27인치");

    if (p1.equals(p2)) {
        System.out.println("두 객체는 동일함");
    } else {
        System.out.println("두 객체는 동일하지 않음"); // <-- 출력
    }
}

예상했겠지만 "두 객체는 동일하지 않음." 이 출력된다.

.equals(), .hashCode() 코드를 생성해주는 @EqualAndHashCode 어노테이션

여기에서도 알아본것처럼 논리적으로 동등 비교를 위해서는 .equals(), .hashCode() 메소드를 오버라이딩하여 별도로 구현을 해주어야한다. 하지만 매번 비슷한 코드를 작성하는 것은 귀찮다.

이 귀찮음을 대신 해주는 것이 @EqualAndHashCode 어노테이션이다. 객체 내에 포함된 필드를 각각 비교할 수 있도록 .equals(), .hashCode() 메소드를 만들어준다.

사용하는 방법은 클래스 위에 @EqualAndHashCode 어노테이션을 부여해주면 끝이다.

@EqualAndHashCode // <-- 추가
class Product {
    private String productName;
    private String productDescription;

    public Product(String productName, String productDescription) {
        this.productName = productName;
        this.productDescription = productDescription;
    }
}

이렇게 추가를 해주고 다시 테스트 코드를 돌려보면 다른 결과가 나온다.

반응형

댓글