Java 8에서 인터페이스에는 구현 된 메소드, 정적 메소드 및 소위 "기본"메소드 (구현 클래스를 대체 할 필요가 없음)가 포함될 수 있습니다.
내 (아마도 순진한) 견해로는 이와 같은 인터페이스를 위반 할 필요가 없었습니다. 인터페이스는 항상 이행해야 할 계약이었으며 매우 단순하고 순수한 개념입니다. 이제 여러 가지가 혼합되어 있습니다. 내 의견으로는 :
- 정적 메소드는 인터페이스에 속하지 않습니다. 유틸리티 클래스에 속합니다.
- "default"메소드는 인터페이스에서 전혀 허용되지 않아야합니다. 이 목적을 위해 항상 추상 클래스를 사용할 수 있습니다.
한마디로 :
자바 8 이전 :
- 추상 및 일반 클래스를 사용하여 정적 및 기본 메소드를 제공 할 수 있습니다. 인터페이스의 역할은 분명합니다.
- 인터페이스의 모든 메소드는 클래스를 구현하여 대체해야합니다.
- 모든 구현을 수정하지 않고 인터페이스에 새 메소드를 추가 할 수는 없지만 실제로는 좋은 방법입니다.
자바 8 :
- 인터페이스와 추상 클래스 (복수 상속 제외) 사이에는 거의 차이가 없습니다. 실제로 인터페이스를 사용하여 일반 클래스를 에뮬레이션 할 수 있습니다.
- 구현을 프로그래밍 할 때 프로그래머는 기본 메소드를 무시하는 것을 잊을 수 있습니다.
- 클래스가 동일한 서명을 가진 기본 메소드를 가진 둘 이상의 인터페이스를 구현하려고하면 컴파일 오류가 발생합니다.
- 인터페이스에 기본 메소드를 추가하면 모든 구현 클래스가이 동작을 자동으로 상속합니다. 이러한 클래스 중 일부는 새로운 기능을 염두에두고 설계되지 않았을 수 있으며 이로 인해 문제가 발생할 수 있습니다. 예를 들어 누군가 누군가
default void foo()
인터페이스에 새로운 기본 메소드 를 추가 하면 동일한 서명을 가진 개인 메소드를 구현 하고 갖는Ix
클래스 는 컴파일되지 않습니다.Cx
Ix
foo
그러한 중대한 변화의 주된 이유는 무엇이며, 어떤 새로운 이점이 있습니까?
@Deprecated
카테고리 에 속하지 않습니다 ! 정적 메소드는 무지와 게으름 때문에 Java에서 가장 악용되는 구문 중 하나입니다. 많은 정적 메소드는 일반적으로 무능한 프로그래머를 의미하고, 수십 배 정도의 커플 링을 증가 시키며, 왜 나쁜 아이디어인지 깨달았을 때 단위 테스트 및 리팩터링에 악몽입니다!