Java-Chip4 / StudyingRecord

강의 내용 정리📝
6 stars 2 forks source link

Object 클래스의 equals 및 hashCode 메서드를 오버라이딩하는 경우에 대한 예시를 요청합니다! #20

Closed charlesuu closed 2 years ago

charlesuu commented 2 years ago

자바의 정석 p.453

앞서 살펴본 것과 같이 클래스의 인스턴스변수 값으로 객체의 같고 다름을 판단해야하 는 경우라면 equals메서드 뿐 만아니라 hashCode메서드도 적절히 오버라이딩해야 한다. 같은 객체라면 hashCode메서드를 호출했을 때의 결과값인 해시코드도 같아야 하기 때문 이다.

객체의 주소가 아니라 멤버 변수 값으로 객체의 같고 다름을 판단하는 경우를 말하는 것 같습니다. 이러면 실제로는 다른 주소를 부여 받은 두 객체라도, 같은 객체처럼 쓰일 것 같은데요. String 외에 이런 경우에 대한 예시를 하나 더 찾아주세요.

anthologia commented 2 years ago

상황에 따라 무한하게 존재할 수 있지 않을까요?

class Time {
    int hour;
    int minute;
    int second;
}

public class Main {
    public static void main(String[] args) {
        Time jooyoungWakeTime = new Time(7, 30, 00);
        Time hyunhoWakeTime = new Time(7, 30, 00);

    }
}

위와 같은 Time 객체가 있다고 가정해봐요.

그리고 jooyoungWakeTime, hyunhoWakeTime 객체를 생성했다고 해볼게요.

두 객체의 주소값은 다를 거에요. 그래서 hashcode()도 다르겠죠.

그런데 클라이언트는 객체의 hour, minute, second 값이 같다면, 같은 객체라고 생각하고 싶대요.

그러면 코드를 어떻게 수정해야 할까요?

class Time {
    int hour;
    int minute;
    int second;

    public Time(int hour, int minute, int second) {
        this.hour = hour;
        this.minute = minute;
        this.second = second;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || this.getClass() != o.getClass()) return false;
        Time time = (Time) o;
        return hour == time.hour && minute == time.minute && second == time.second;
    }

    @Override
    public int hashCode() {
        return Objects.hash(hour, minute, second);
    }
}

위와 같이 equals()와 hashcode()를 오버라이딩함으로써 요구사항을 충족시켜줄 수 있을 것 같아요.

본래 Object.hashcode()는 두 객체를 서로 equals()로 비교해서 값을 만들어주니까요. (https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode())

charlesuu commented 2 years ago

오잉 주영이가 답변해줬넹

charlesuu commented 2 years ago

어떤 경우인지 잘 와 닿았어요. 따봉따봉