Closed zpqmdh closed 2 months ago
Q.
Default method의 제약에 대해 설명하고 있습니다. 이때 3가지 제약에 대해 구체적으로 왜 안 되는지 설명해주실 수 있나요?
A.
abstract
이기 때문에 자기 자신이 객체 인스턴스로 생길 수 없습니다. 따라서 생성자를 만드는 것 자체가 불가능합니다.public static final
로 선언되어야 합니다. 만약 이런 제한자가 붙지 않을 경우, 컴파일 타임에 자동으로 public static final
이 붙습니다.public abstract
수식어가 붙어야 합니다. 필드와 마찬가지로 이런 제한자가 붙지 않을 경우 컴파일 타임에 자동으로 public abstract
수식어가 붙습니다.abstract
하기 때문에(abstract
메서드를 가지므로) 객체 인스턴스를 생성하는 것이 불가능합니다. 따라서 인스턴스 필드를 가질 수 없습니다.public
이 아닌 static
멤버를 가질 수 없는 이유public
이 아닌 정적 멤버를 가질 수 없는 이유에 대해 설명하겠습니다.private
키워드가 붙은 메서드 및 변수들은 모두 상속 대상에서 제외됩니다. 따라서 만약 존재한다 해도 아무런 의미를 가지지 못하게 됩니다.
private static method
는 예외인데 default method와 같은 곳에서 해당 메서드를 사용하지만 이를 외부에 공개하고 싶지는 않을 때 사용하는 경우가 존재하기 때문입니다.private method
는 원래는 필요하지 않았으나, JDK 1.8에서 default method가 추가되면서 필요성이 생겼고, 그 다음 릴리즈인 JDK 1.9에서 추가되었습니다.equals()
, hashCode()
메서드는 default method로 제공하면 안된다.equals()
, hashCode()
를 재정의 하지는 않는다는 것입니다.hashCode()
는 물론이고 equals()
에 대해서도 큰 문제가 발생할 수 있습니다.
equals()
를 재정의하지 않는다면 상위 인터페이스에 적힌 규약대로 equals()
가 구현되게 되어 equals()
의 일반 규약(item 10)이 깨어질 위험성이 매우 커질 수 있습니다.hashCode()
역시 객체가 표현하는 값들을 hashCode()
에 모두 담지 못할 수 있으므로 문제가 발생할 수 있습니다. 또한 equals()
와 마찬가지로 규약이 깨어질 위험성이 매우 커질 수 있습니다.clone()
도 마찬가지입니다.equals()
와 hashCode()
를 재정의해야하며 이는 재정의할 필요가 없는 클래스까지도 구현이 강제되어 이를 개발하는 개발자에게 부담을 줄 수 있습니다.
책 132쪽에서는 Default method 의 제약에 대해 설명하고 있습니다.
총 3가지 제약에 대해 구체적으로 왜 안 되는지 설명해주실 수 있나요?