public boolean equals(Object obj) {
return (this==obj); // 주소 비교
}
주소가 같을 때만 true 다!만약 안에 들어있는 값을 비교하고 싶다면 주소비교가 아닌 .value를 통해 비교를 해야한다.(서로 다른 객체를 equals로 비교하면 항상 false가 나오므로)
그런데 이때, obj.value()는 에러가 나므로 Value로 형변환을 해줘야 한다.
이때 참조변수의 형변환 전에는 반드시 instanceof로 확인해야한다. 따라서 최종 버전은 아래와 같다.
Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); //true
System.out.println(str1.hashCode()); //96354
System.out.println(str2.hashCode()); //96354
equals()가 true면 hashCode()값도 같아야 한다.
오버라이딩을 해주는 이유는
객체 == iv 의 집합 이므로 객체를 문자열로 변환한다는 것은 iv의 값을 문자열로 변환한다는 것과 같다.
만약 equals()도 오버라이딩을 해준다면?
kind는 String이니까 this.kind == c.kind가 아니라 this.kind.equals(c.kind)로 해준다.
그런데 equals()를 오버라이딩 해주면, hashCode()도 오버라이딩을 해줘야한다.
참고로 Objects.hash() 안에 인자는 1개여도 되고 여러개여도 된다.