회사 업무를 하면서 @EqualsAndHashCode
어노테이션을 자주 목격했다. 대충은 .equals() 와 .hashCode() 코드를 만들어주는가보다 생각했는데, 정확하지 못해서 한번 정리는 해야겠다고 생각했었다. 그래서 알아보니 .equals()
와 .hashCode()
부터 이해해야 했고, 여기에서 정리를 한번 했다. 이제 @EqualsAndHashCode
에 대해 알아보도록 하자.
Lombok 이 제공하는 @EqualAndHashCode
공식 사이트에서 정의하는 @EqualAndHashCode
는 다음과 같다.
Equality made easy: Generates
hashCode
andequals
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;
}
}
이렇게 추가를 해주고 다시 테스트 코드를 돌려보면 다른 결과가 나온다.
'자바' 카테고리의 다른 글
[자바] 인터페이스와 추상 클래스 (feat. ChatGPT) (0) | 2023.03.03 |
---|---|
[자바] 메소드 시그니쳐 (method signature) (0) | 2023.02.25 |
[자바] .equals(), .hashCode() 메소드에 대해 알아보자 (0) | 2023.02.11 |
[자바] Stream .sorted() 활용 (0) | 2023.02.06 |
[자바] String 과 new String(); 의 차이 (2) | 2023.02.03 |
댓글