2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[item 10] 하위클래스에서의 equals 규약 #26

Closed NuhGnod closed 1 year ago

NuhGnod commented 1 year ago

p.60에서 맨아래에 체크박스의 추상 클래스의 하위 클래스에서라면 equals규약을 지키면서도 값을 추가할 수 있다. 부분입니다. 위 문장이 잘 이해가 되지않네요!

gmelon commented 1 year ago

저도 이 문장이 잘 이해가 되지 않아서 코드로 풀어보려고 노력했지만 어렵네요ㅜㅜ

대신 직관적으로 이해해보자면,, 상위 클래스를 인스턴스화 할 수 있는 경우 아래와 같이 상위 클래스로 equals() 메시지를 전달해주잖아요? (Point는 ColorPoint의 상위 클래스이므로 해당 인스턴스가 ColorPoint가 아니면 Point일 것이라는 가정 하에)

public class ColorPoint extends Point {

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Point)) {
            return false;
        }

        if (!(o instanceof ColorPoint)) {
            return o.equals(this);
        }

        return ...;
    }
}

그런데 만약 Point 클래스가 abstract 이면, 주어진 객체가 ColorPoint가 아니면 무조건 다른 객체이므로 (상위에 인스턴스가 존재할 수 없으므로) 메시지를 전달해 상위 클래스에서 값이 같은지를 확인할 필요가 없게 됩니다. 같은 이유로 instanceof 와 getClass()의 차이로 발생하는 문제도 해결될 수 있을 것 같아요.

그래서 값을 갖지 않는 추상 클래스의 하위 클래스 에서는 책에서 언급한 문제들이 발생하지 않는다고 한게 아닌가 생각합니다!