2023-java-study / book-study

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

[item 20] 인터페이스의 사용 방법 #77

Open NuhGnod opened 1 year ago

NuhGnod commented 1 year ago

p.132에서 equals, hashCode같은 Object 메서드는 디폴트 메서드로 제공해서는 안된다. 라고 합니다. 왜 제공해서는 안되는지에 대해 설명해주고있지 않아, 제가 좀 찾아봤는데 영어 해석하기 가 좀 빡세네여,,,

제가 이해한 원인?이유는 다음과 같습니다.

  1. 메소드 호출의 규칙(?) 우선순위가 정해짐.

    • 클래스 > 인터페이스
    • 자식클래스 > 부모클래스
    • 명시적 호출 > 묵시적 호출 따라서, 모든 클래스는 내부적으로 Object클래스를 상속받고 있으므로, 인터페이스에서 default로 equals, hashCode 등을 제공해도 사용되지 않을 것이다. => 이는 혼란만 야기한다.
  2. 목적이 어긋남 기본적으로 defalut 메소드를 사용하는 이유는 문제없이 기존 인터페이스에 추가적으로 기능을 제공하기 위함입니다. 따라서, equals, hashCode는 이미 Object 클래스에 정의되어있는 메소드이므로 굳이 default로 제공해줄 필요가 없다고 생각됩니다.. 그리고 제가 Intellij 로 default로 작성해보려 했는데 Error를 띄워줘서 컴파일 자체가 안되는데 default로 제공하는 방법이 있나 궁금합니다.

그럼에도 불구하고 유용한 상황이 있을 것 같아 생각해보았는데, 이 부분은 수요일날 코드로 보시는게 좀더 나을것 같네요..!

equals, hashCode같은 Object 메서드는 디폴트 메서드로 제공해서는 안된다. 에 대한 생각이 궁금합니다.!


Why is it forbidden to define a default method for a method from java.lang.Object https://stackoverflow.com/questions/24016962/java8-why-is-it-forbidden-to-define-a-default-method-for-a-method-from-java-lan

Allow default methods to override Object's methods https://mail.openjdk.org/pipermail/lambda-dev/2013-March/008435.html

Can we Override defualt method in java? https://www.geeksforgeeks.org/can-we-override-default-method-in-java/

ssstopeun commented 1 year ago

저는 Object가 모든 java클래스의 기본 클래스라는 부분을 중점으로 이해했습니다. 모든 클래스들이 Object의 코드를 재정의하여 사용하거나 그냥 사용하고 있는데 이를 인터페이스에서 디폴트로 제공해버린다면 이 인터페이스를 구현하여 사용하는 클래스들에서 Object 클래스를 사용할 때 혼란이 생길 수 있을 것 같습니다. 아니면 기존에 Object 클래스들을 사용하고 있는 클래스가 equals나 hashCode가 디폴트 메서드로 정의되어 있는 인터페이스를 implements 했을 때도 문제가 될 것 같습니다.

Object메서드를 디폴트 메서드로 제공했을때의 위험이 커서 쓰지 말아라 라고 이해했습니다.


Object 클래스를 모든 java클래스가 기본으로 상속받고 있는 것이고 인터페이스는 Object 클래스를 상속받지 않아 Error가 나는 것 같습니다. default메소드로 제공하는 방식은 시도해봤는데 실패했습니다ㅜㅜ

ssstopeun commented 1 year ago
default boolean equalName(String str){
        return getName().equalsIgnoreCase(str);
 }
@Override
    public boolean equals(Object obj){
        if(obj instanceof Dog){
            Dog dog = (Dog) obj;
            return dog.equalName(getName());
        }
        return false;
    }

이런식으로 equals처리를 하고 싶은 것을 다른 이름의 디폴트메서드로 정의하고 클래스에서 equals를 재정의할때 이 디폴트 메서드를 사용하는 것은 어떻게 생각하시나요...?