Closed charlesuu closed 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())
오잉 주영이가 답변해줬넹
어떤 경우인지 잘 와 닿았어요. 따봉따봉
자바의 정석 p.453
객체의 주소가 아니라 멤버 변수 값으로 객체의 같고 다름을 판단하는 경우를 말하는 것 같습니다. 이러면 실제로는 다른 주소를 부여 받은 두 객체라도, 같은 객체처럼 쓰일 것 같은데요. String 외에 이런 경우에 대한 예시를 하나 더 찾아주세요.