본문 바로가기
Java

[Lombok] 경고 해결하기 @EqualsAndHashCode

by @developer.kye 2021. 4. 7.

- 경고문구

Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.

 

- 경고의 의미

Lomok 의 @Data@ToString, @EqualsAndHashCode, @Getter, @Setter  @RequiredArgsConstructor 를 한번에 생성시켜주는 어노테이션이다. 

 

주로 모든 Model들에 @Data 어노테이션을 추가하게되는데, 상속받은 클래스의 경우 위 경고 메세지가 나온다. 아래의 경우 Student 클래스에서 경고가 난다.

@EqualsAndHashCode 를 수행하면서, 즉 equals() 함수와 hashCode() 함수를 각각의 클래스에 자동 생성을 하면서,

부모와 자식 클래스의 함수들이 중복이 되면서 나오는 경고이다.

@Data
public class Person {
    private String name;
}

@Data  //<= 여기에서 경고가 난다
public class Student extends Person {
    private String school;
    private Integer classNumber;
}

Java 객체(java.lang.Object)의 equals() 함수와 hashCode() 함수는 다음과 같다.

- equals() : 두 객체의 내용이 같은지 확인하는 함수

- hashCode() : 두 객체가 동일한 객체인지 확인하는 함수

 

equals()함수와 hashCode() 함수는 객체 내의 파라미터들이 고려되어 자동생성되는데, 

위 경고는 부모 클래스의 파라미터들은 고려하지 않았다고 알리는 경고 문구인 것이다.

 

즉, 같은학교 같은 반에 이름이 다른 두 명의 학생이 있는데, 학교와 반만 보고 같은 사람이라고 하게되는 꼴이 된다는 뜻이다.

Student student1 = new Student();
student1.setName("홍길동");
student1.setSchool("카이초");
student1.setClassNumber("3");

Student student2 = new Student();
student2.setName("신춘향");
student2.setSchool("카이초");
student2.setClassNumber("3");

System.out.println(student1.equals(student2));
// => true 가 됨

 

 

- 해결 방법

부모의 파라미터까지 고려해서 equals()와 hashCode() 함수를 생성하려면 

@RequiredArgsConstructor(callSuper=true) 를 입력해주면 된다.

@Data
public class Person {
    private String name;
}

@Data
@RequiredArgsConstructor(callSuper=true)  //<= 추가해준다
public class Student extends Person {
    private String school;
    private Integer classNumber;
}

 

* 참고: 부모클래스의 파라미터를 고려하지 않겠다고 의도한게 맞으면 @RequiredArgsConstructor(callSuper=false) 를 해주면 된다.