Lombok과 자바의 equals(), hashCode() 그리고 @EqualsAndHashCode

김재현·2023년 12월 4일
0

TIL

목록 보기
48/88
post-thumbnail

어제오늘은 테스트코드에 시간을 많이 쏟았으나 건진것 없이 허우적...
해설 강의를 듣고서야 깨달음을 얻을 수 있었다.


@EqualsAndHashCode 애너테이션

이 애테이션의 역할을 검색하면 "Lombok 라이브러리에서 제공하는 애너테이션 중 하나로, 클래스의 equals 및 hashCode 메서드를 자동으로 생성해주는 기능을 제공한다."라고 나온다.

하지만 나는 의문이 들었다.

equals와 hashCode 메서드는 이미 자바에 있지 않아? 무슨 차이지?

그렇다면 저기서 말하는 Lombok의 equals 및 hashCode 메서드는 무엇이란 말인가??

자바의 equals(), hashCode()

자바를 처음 공부 할 때 배우다시피 객체마다 다른 hashCode를 가진다.
그렇기 때문에 아래와 같이 두 객체의 참조가 동일한지 비교하는 equals 메서드를 실행한다면 HashCode가 다르기 때문에 false를 반환한다. 이것이 내가 알던 메서드였다.
(hashCode 메서드는 HashCode값을 반환)

//@EqualsAndHashCode
public class MyClass {
    private String field1;
    private int field2;

    public MyClass(String field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public static void main(String[] args) {
        MyClass obj1 = new MyClass("abc", 42);
        MyClass obj2 = new MyClass("abc", 42);

        // equals 메서드 사용
        boolean areEqual = obj1.equals(obj2);
        System.out.println("Are objects equal? " + areEqual);

        // hashCode 메서드 사용
        int hashCode1 = obj1.hashCode();
        int hashCode2 = obj2.hashCode();
        System.out.println("Hash code for obj1: " + hashCode1);
        System.out.println("Hash code for obj2: " + hashCode2);
    }
}

Lombok의 equals(), hashCode()

그렇다면 Lombok의 메서드라는 것은 무슨 의미인가?

개발을 하다보면 해당 클래스에서 (참조하는 주소가 아닌) 객체의 내용 자체를 비교하고 싶을 때가 있다. 이 때 @EqualsAndHashCode를 달고 equals(), hashCode() 메서드를 사용하면 아래와 같은 결과가 나온다!

@EqualsAndHashCode
public class MyClass {
    private String field1;
    private int field2;

    public MyClass(String field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public static void main(String[] args) {
        MyClass obj1 = new MyClass("abc", 42);
        MyClass obj2 = new MyClass("abc", 42);

        // equals 메서드 사용
        boolean areEqual = obj1.equals(obj2);
        System.out.println("Are objects equal? " + areEqual);

        // hashCode 메서드 사용
        int hashCode1 = obj1.hashCode();
        int hashCode2 = obj2.hashCode();
        System.out.println("Hash code for obj1: " + hashCode1);
        System.out.println("Hash code for obj2: " + hashCode2);
    }
}

참조 주소가 아닌 필드값 자체를 비교하는 것이다.

이런 결과에 대한 힌트는 이미 애너테이션의 설명에 나와있었다.

@EqualsAndHashCode

Generates implementations !!

생성하는게 아니라 메서드를 implementaion. 즉, 오버라이드하는 것이다.

메서드를 다른 기능으로 정의하는 것이었다.

그동안 깔끔하게 정리되어 보기 편한 블로그 글 위주로 공부했었는데,
자바의 공식 문서와 직접 타이핑해서 얻는 지식을 신뢰하며 공부해야겠다는 생각이 들게 되었다.

블로그 글을 너무 믿진 말자!

profile
I live in Seoul, Korea, Handsome

0개의 댓글