작성
·
289
0
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
jdbc 개발-조회 강의에서 MemberRepositoryV0Test 에서 findById 에서 isEqualTo()에서 결과가 참인 이유가 롬복의 @Data 가 equals()를 오버라이딩해서라고 하셨는데 롬복의 @Data 를 만약 안쓰면 isEqualTo() 값이 false가 되나요??
@Data 안 써도 isEqualTo() 자체가 자바의 equals() 랑 비슷해서 참이 되어야 하는거 아닌가요??
답변 1
0
안녕하세요. 황지호님, 공식 서포터즈 y2gcoder입니다.
jdbc 개발-조회 강의에서 MemberRepositoryV0Test 에서 findById 에서 isEqualTo()에서 결과가 참인 이유가 롬복의 @Data 가 equals()를 오버라이딩해서라고 하셨는데 롬복의 @Data 를 만약 안쓰면 isEqualTo() 값이 false가 되나요??
=> 네 맞습니다. 먼저 오버라이딩해줬다는 것이 그냥 equals()를 그대로 다시 썼다는 것이 아닙니다. 보통 오버라이딩의 목적은 원래 구현과 다르게 사용하기 위해서 말그대로 재정의 해주는 것입니다. equals()는 재정의하지 않을 때는 Object의 equals()를 그대로 사용합니다. 그리고 Object의 equals는 객체의 reference 값을 비교해서 두 객체가 동일한지 판단합니다. 그런데 @Data를 쓰면(정확히는 @EqualsAndHashCode를 사용하면) 기본적으로 롬복이 equals()를 객체의 모든 필드값끼리 비교하는 것으로 재정의하게 됩니다. 예를 들어 기존에는 객체의 참조값이 다르면 두 객체를 동일하지 않다고 판단했다면, @Data를 붙인 클래스를 객체로 만들어 equals()로 비교하면 두 객체가 가진 필드들을 비교하면서 두 객체가 가진 필드들이 동일하면 동등한 것으로 판단하여 true를 반환하도록 재정의한다는 것입니다. 이 부분에 대해서는 자바 equals(), 동일성, 동등성 과 같은 키워드로 공부해보시길 추천합니다.
@Data 안 써도 isEqualTo() 자체가 자바의 equals() 랑 비슷해서 참이 되어야 하는거 아닌가요??
=>@Data는 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode 를 한꺼번에 달아주는 것과 같은 효과를 냅니다. 그 중에서 @EqualsAndHashCode 가 equals()를 재정의해주게 됩니다. 그러니 @Getter, @Setter, @RequiredArgsConstructor, @ToString 만 달고 @Data를 지우신 후 직접 테스트해서 결과를 보시는 것이 더 직관적이라 생각합니다. isEqualTo()라는 메서드는 정확하게는 해당 객체의 equals()를 이용해서 판단하는 것입니다.
감사합니다.