어제오늘은 테스트코드에 시간을 많이 쏟았으나 건진것 없이 허우적...
해설 강의를 듣고서야 깨달음을 얻을 수 있었다.
이 애테이션의 역할을 검색하면 "Lombok 라이브러리에서 제공하는 애너테이션 중 하나로, 클래스의 equals 및 hashCode 메서드를 자동으로 생성해주는 기능을 제공한다."라고 나온다.
하지만 나는 의문이 들었다.
equals와 hashCode 메서드는 이미 자바에 있지 않아? 무슨 차이지?
그렇다면 저기서 말하는 Lombok의 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의 메서드라는 것은 무슨 의미인가?
개발을 하다보면 해당 클래스에서 (참조하는 주소가 아닌) 객체의 내용 자체를 비교하고 싶을 때가 있다. 이 때 @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);
}
}
참조 주소가 아닌 필드값 자체를 비교하는 것이다.
이런 결과에 대한 힌트는 이미 애너테이션의 설명에 나와있었다.
Generates implementations !!
생성하는게 아니라 메서드를 implementaion. 즉, 오버라이드하는 것이다.
메서드를 다른 기능으로 정의하는 것이었다.
그동안 깔끔하게 정리되어 보기 편한 블로그 글 위주로 공부했었는데,
자바의 공식 문서와 직접 타이핑해서 얻는 지식을 신뢰하며 공부해야겠다는 생각이 들게 되었다.
블로그 글을 너무 믿진 말자!