인프런 커뮤니티 질문&답변

코딩먹는하마님의 프로필 이미지
코딩먹는하마

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

JDBC 개발 - 조회

equals()가 비교하는 것이 뭔가요??

작성

·

619

·

수정됨

0

Member의 @Data를 아래와 같이 바꿨습니다.

//@Data
@Getter
@Setter
@ToString
public class Member {
    private String memberId;
    private int money;
    public Member() {
    }
    public Member(String memberId, int money) {
        this.memberId = memberId;
        this.money = money;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Member member = (Member) o;
        return money == member.money && Objects.equals(memberId, member.memberId);
    }

    @Override
    public int hashCode() {
       return Objects.hash(memberId, money);
    }
}

그리고 MemberRepositoryV0Test에서 equals()에서 일어나는 일을 생각해보았습니다.

//findById
Member findMember = repository.findById(member.getMemberId());

log.info("findMember.equals(member) = {}",findMember.equals(member));

 

1. 첫번째 질문

제가 생각했을 때는 Member의 hashCode()에서

findMember와 memer가 (memberId, money)가 같으면 같은 hash값을 줍니다.

그다음 equals()에서 hash값이 같으면 True를 반환하고 hash값이 없어도 (memberId, money)를 비교하여 같으면 True를 반환해줍니다.

제가 정리한게 맞는 지 궁금합니다.

 

2. 두번째 질문

Member에서 equals()를 오버라이딩 안하고 MemberRepositoryV0Test에서 equals를 하면

findMember.equals(member) = false

가 나오는 이유는 Object.equals()는 내부적으로 ==연산을 취하기 때문이다

라고 생각했는 데 이게 맞을까요??

 

3. 세번째 질문

 저는 isEqualTo()가 대상의 내용자체를 비교한다라고 알고 있었는데

수업시간에 isEqualTo() 내부에 equals()를 포함한다고 배웠습니다.

그럼 만약 Object.equals()라면 객체의 주소를 비교 하나요??

 

답변주시면 정말 감사하겠습니다.

답변 1

1

안녕하세요, 코딩먹는하마 님. 공식 서포터즈 y2gcoder 입니다.

제가 생각했을 때는 Member의 hashCode()에서

findMember와 memer가 (memberId, money)가 같으면 같은 hash값을 줍니다.

그다음 equals()에서 hash값이 같으면 True를 반환하고 hash값이 없어도 (memberId, money)를 비교하여 같으면 True를 반환해줍니다.

제가 정리한게 맞는 지 궁금합니다.

=> 먼저 hashCode()와 equals()는 사용하는 목적이 다릅니다.

  1. equals() 메소드: equals() 메소드는 두 객체의 동등성을 비교하는데 사용됩니다. 동등성이란 두 객체가 같은 상태를 가지고 있는지를 확인하는 것입니다. 예를 들어, 두 Person 객체가 같은 이름과 나이를 가지고 있다면, 이들은 동등하다고 할 수 있습니다. equals() 메소드는 재정의를 통해 이 같은 비교 로직을 정의할 수 있습니다.

  2. hashCode() 메소드: hashCode() 메소드는 객체의 해시 코드를 반환하는데 사용됩니다. 해시 코드는 객체를 효과적으로 관리하기 위해 사용되는 정수 값입니다. Java의 해시 기반 컬렉션(예: HashMap, HashSet 등)에서는 이 해시 코드를 사용해 객체를 빠르게 검색하고 위치 지정합니다. hashCode() 메소드 역시 재정의를 통해 특정 클래스에 적합한 해시 코드 생성 로직을 정의할 수 있습니다.

동등성 비교를 위해 사용하는 메서드는 본질적으로 equals() 메서드입니다. hashCode()는 위의 설명과 다음 링크(클릭)의 설명을 읽어보시면 정리가 되실 것 같습니다.

Member에서 equals()를 오버라이딩 안하고 MemberRepositoryV0Test에서 equals를 하면

findMember.equals(member) = false

가 나오는 이유는 Object.equals()는 내부적으로 ==연산을 취하기 때문이다

라고 생각했는 데 이게 맞을까요??

=> 맞습니다.

public boolean equals(Object obj) {
    return (this == obj);
}

Object 의 equals()는 기본적으로 이렇습니다. 객체 간의 == 연산에서는 해당 객체의 주소값을 기준으로 비교하기 때문에 false가 나온 것입니다.

감사합니다.

코딩먹는하마님의 프로필 이미지
코딩먹는하마

작성한 질문수

질문하기