이펙티브 자바 Item 20을 읽으면서...
"default 메서드에 equals와 hashCode, toString처럼 Object의 메서드를 재정의하지 말라"라는 문구가 있었습니다.
🤔 코드를 작성해보니..? 컴파일 에러가 발생한다..?
어라라..? 옛날에는 이게 가능했나보네 싶었고 왜 이제 컴파일 에러가 발생하는 걸까? 라는 궁금증이 생겼습니다.
- 혹은 똑똑한 intellij가 😎
만약 클래스 B는 의도적으로 Object 클래스를 구현하는 A 인터페이스를 구현할 수 있다면??
- B는 Object 클래스와 Interface 중에서 어떤 equals를 사용해야 할까요..?
(충돌이 일어날거 같다?)
찾아보니 이런 규칙이 있었다!
- 클래스는 항상 승리한다! 뭔가 멋있네요.. 명언같기도 하고
- 즉, 우선순위가 하위 인터페이스 보다 클래스가 높다라는 의미 입니다.
테스트
클래스가 우선순위를 갖고 추상 클래스의 test() 메서드가 호출되는 것을 확인할 수 있었습니다.
추상클래스와 인터페이스의 목적
우리는 "추상 메서드를 구현한다" 라는 의미는 동일하지만 목적을 생각하면 다르다는 것을 알고 있습니다.
- 추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장시키는 용도로 사용한다.
- 인터페이스는 구현을 강제함으로써 구현 객체의 같은 동작을 보장하는 용도로 사용한다. (다형성)
💬 결론
추상 클래스와 인터페이스의 목적을 고민하면서 생각을 해봤습니다.
Java 세상에서 모든 클래스는 Object를 상속하기 때문에 이미 Object를 확장한다는 의미를 가지고 있습니다.
하지만 인터페이스의 목적은 자신을 구현해서 다형성 등을 챙기며 점점 성숙한 클래스를 만드는 의미를 담고 있다고 생각합니다.
인터페이스에서 자신을 구현해야 하는 클래스의 상위 구현을 재정의한다는 것은 어떻게 보면 계층 구조에 문제를 일으키지 않는 인터페이스로써 역할을 제대로 하지 못하고 자신을 구현하라는 용도와도 맞지 않다고 생각합니다. 즉 클래스가 항상 승리한다는 Rule 역시 이런 의도에서 생기게 되었다고 생각이 들었습니다.
마지막으로 클래스가 항상 승리한다는 Rule를 적용해 보면 인터페이스에서 Object 클래스를 재정의 했더라도 Class가 항상 승리한다는 조건에서 인터페이스의 기본 구현 메서드가 쓸모없게 되어 버리면서 자바는 컴파일 에러를 만든 게 아닌가 생각을 했습니다.
인터페이스가 주제 파악을 못한 게 아닐까? 주제넘은 발언을 해봤습니다.
📚 Reference
'Java' 카테고리의 다른 글
Enum에서 어떻게 비교할까? (Objects.equals(), equals(), == 비교 연산자) (0) | 2024.02.17 |
---|---|
JVM의 개념 및 구조(JDK, JRE, JIT 컴파일러) (0) | 2024.02.04 |
타입추론 var에 대해서 (0) | 2024.02.02 |
추상 클래스와 인터페이스 (0) | 2023.08.17 |