필자가 경험상 많이 사용하는 6가지 메소드
참조 자료형에서는 "값"을 비교하는게 아니라 "주소값"을 비교한다.
두 객체는 각각의 생성자를 사용하여 만들었기 떄문에 속성 값이 같더라도 주소 값이 다르다.
equals()메소드를 비교할 클래스에 Overriding하지 않으면 equals()메소드에서는 hashCode()값(주소값)을 비교한다.
equals() 메소드를 Overriding할 떄에는 hashCode()메소드도 같이 Overriding해야만 한다. 왜냐하면 equals()메소드를 Overriding해서 객체가 서로 같다고 이야기할 수는 있겠지만 그 값이 같다고 해서 그 객체의 주소 값이 같지는 않기 때문이다. 따라서, 같은 hashCode() 메소드 결과를 갖도록 하려면 hashCode() 메소드도 Object 클래스에서 제공하는 그대로 사용하면 안된다.
equals()메소드를 반드시 Overriding할 필요는 없다. 필요할 때만 Overriding한다.
equals() 메소드를 overriding할 때 지켜야 할 조건
1) 재귀 : null이 아닌 x라는 객체의 x.equals(x)결과는 항상 true여야 한다.
2) 대칭 : null이 아닌 x,y객체가 있을 때 x.equals(y)가 true를 리턴했다면,
y.equals(x)도 true를 리턴해야만 한다.
3) 타동적 : null이 아닌 x,y,z가 있을 때, x.equals(y)가 true를 리턴하고,
y.equals(z)가 true를 리턴하면, x.equals(z)는 반드시 true를 리턴해야한다.
4) 일관 : null이 아닌 x,y가 있을 때 객체가 변경되지 않은 상황에서는 몇번을 호출하더라도
x.equals(y)의 결과는 항상 true거나 항상 false여야만 한다.
5) null과의 비교 : null이 아닌 x라는 객체의 x.equals(null) 결과는 항상 false여야만 한다.