이미 JAVA는 오랜시간동안 사용되었습니다.
그런데 람다라는 개념을 넣으면서 interface의 내용이 추가될 필요가 생겼습니다.
여기서 interface에 method를 추가하려면 interface를 구현한 모든 클래스에도 해당 method를 구현해야 한다는 문제가 발생합니다.
또한 기존의 버전과 호환성 문제도 있고 사용자가 JAVA 기본 interface를 구현한 경우 문제가 발생합니다.
그렇기 때문에 interface에 default method와 static method를 추가했습니다.
default interface에 대한 의문점들
default method의 diamond 상속문제
자바는 다중상속이 되지 않습니다. 그래서 diamond상속문제가 그 동안은 없었습니다.
하지만 interface에 method를 추가시킨다는 개념이 도입되면서 diamond상속문제에 대해서 어떻게 동작하는지 의문이 들었습니다.
####실험1
먼저 default method인 ccc를 상속받아서 override하는 2개의 interface를 만들었습니다.
그리고 그 둘을 구현하는 Diamond class를 만들었습니다.
그러자 이클립스에서 아래와 같은 에러를 보여줍니다.
####실험2
다음으로 AInterface만 ccc method를 구현해 보겠습니다.
결과는 실패로 나왔고 ccc() method의 return값은 0이었습니다.
즉, AInterface의 override한 default method가 아니라 Interface의 default method를 호출한 것이었습니다.
####실험3
이번에는 상속 받는 순서를 바꾸고 테스트해보겠습니다.
그래도 똑같은 결과가 나옵니다.
####실험4
이번에는 AInterface와 BInterface에 아래와 같이 변경하고 테스트 해보겠습니다.
이번에도 아래와 같은 메세지가 나옵니다.
결론 1. 실험1과 실험4로 보아 구현하는 interface에 같은 method의 형태가 있을 때는 에러가 발생 2. 실험2와 실험3으로 보아 diamond상속이 있으면 interface의 최상위에 정의한 default method가 호출됩니다.
static method 상속 문제
static method는 어떤 형태로 호출되는지에 대해서 확인해보겠습니다.
####실험1
static method를 구현한 클래스에서 그냥 호출해 보겠습니다.
아래와 같이 에러메세지가 나옵니다.
즉, static method는 구현하는 클래스에서 method명만으로는 호출이 안됩니다.
####실험2
Interface를 상속받는 interface의 경우에는 static method가 호출이 되는지 확인해보겠습니다.
이것도 아래와 같이 에러메세지가 나옵니다.
결론
* static method의 경우 상속이나 구현을 해도 method를 호출하기 위해서는 ‘해당 클래스.method’ 형태로 호출해야 합니다.
default method는 상속의 상속시에도 사용할 수 있을까?
default method가 과연 상속의 상속을 받아도 사용할 수 있는지 알아보겠습니다.
####실험1
default method가 있는 interface를 구현한 클래스를 상속받은 클래스에서 default method의 사용이 가능한지 실험해보겠습니다.