inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

JDBC 개발 - 조회

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

713

코딩먹는하마

작성한 질문수 74

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()라면 객체의 주소를 비교 하나요??

 

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

spring

답변 1

1

y2gcoder

안녕하세요, 코딩먹는하마 님. 공식 서포터즈 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가 나온 것입니다.

감사합니다.

spring initialiser 어떤걸 선택해야될지 모르겠어요

0

38

2

트랜잭션 템플릿이 체크예외는 커밋하는 이유가 궁금합니다.

0

51

1

jdbc 학습하다 궁금해서 질문드려요

0

84

1

정상이체와 이체중 예외발생 차이

0

70

2

이번 강의부터가 JDBC 직접 사용 맞나요?

0

89

1

순수한 서비스 계층에 대한 의문???

0

82

2

3_4test, 4test 자동 리소스 안됨

0

59

2

데이터베이스 선택 관련 질문.

0

69

2

after 메서드 사용 유무

0

59

2

데이터베이스 접근 및 DB 락

0

57

1

@SpingBootTest, @TestConfiguration

0

57

1

Read Committed 격리 수준 사용 관련 질문

0

50

1

AopCheck Test 부분의 EnhancerBySpring 확인 법??

0

68

2

커리큘럼 관련 질문

0

78

1

서비서 계층 스프링 프레임워크 사용

0

88

1

validation(toMember)의 위치

0

84

2

데이터 계층에서 서비스 로직의 datasource를 인식하는 방법

0

166

2

member 상수 질문

0

124

2

ctrl + F6 이후로 con 인식이 안 됩니다

0

154

2

DrivenManager 와 Connection 반환에 대한 질문입니다!

0

110

1

섹션5 트랜잭션 템플릿관련 질문(이기종 DB)

0

116

1

세션1 테이블 조회결과 그림은 Redo 로그에 속하나요?

0

103

1

트랜잭션이 필요하지 않은 경우 DB 대신 파일 시스템을 사용하는 것이 더 효율적인가?

0

98

1

강의 14분쯤 Exception 질문

0

116

2