인터페이스에는 원래 추상메소드만 선언할 수 있었다.
JDK1.8 부터 디폴트 메소드와 static메소드도 추가할 수 있게 되었다.
static메소드는 인스턴스와 관계가 없는 독립적인 메소드이기 때문에 예전부터 인터페이스에 추가하지 못할 이유가 없었다. 그러나 규칙을 단순히 할 필요가 있어서 인터페이스의 모든 메소드는 추상 메소드이어야 한다는 규칙에 예외를 두지 않았다. 그래서 인터페이스와 관련된 static메소드는 별도의 클래스에 따로 두어야 했다.
디폴트 메소드
조상 클래스에 새로운 메소드를 추가하는 것은 별 일 아니지만, 인터페이스의 경우에는 매우 큰일이다.
인터페이스에 메소드를 추가한다는 것은 추상메소드를 추가한다는 것이고, 이 인터페이스를 구현한 기존의 모든 클래스들이 새로 추가된 메소드를 구현해야 하기 때문이다.
그래서 디폴트 메소드라는 것이 생겨났다. 디폴트 메소드는 추상메소드의 기본적인 구현을 제공하는 메소드로,
추상메소드가 아니기 때문에 디폴트 메소드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.
디폴트 메소드 앞에 키워드 default를 붙이며 추상 메소드와 달리 일반 메소드처럼 { }이 있어야 한다.
디폴트 메소드 역시 접근 제어자가 public이며, 생략가능하다.
interface MyInterface{
void method() ;
void newMethod() ;
}
여기서 newMethod() 는 추상메소드이다.
이것을 디폴트 메소드로 정의한다면,
MyInterface를 구현한 클래스는 변경하지 않아도된다.
interface MyInterface{
void method() ;
default void newMethod() { }
}
즉, 조상클래스에 새로운 메소드를 추가한 것과 동일해 지는 것이다.
대신, 새로 추가된 디폴트 메소드가 기존의 메소드와 이름이 중복되어 충돌하는 경우가 발생하는데,
이 충돌을 해결하는 규칙은 다음과 같다.
1. 여러 인터페이스의 디폴트 메소드 간의 충돌
-인터페이스를 구현한 클래스에서 디폴트 메소드를 오버라이딩 해야 한다.
2. 디폴트 메소드와 조상클래스 메소드 간의 충돌
-조상 클래스의 메소드가 상속되고, 디폴트 메소드는 무시된다.
다음 예시를 살펴보자.
Child클래스는 Parent클래스를 상속받고, MyInterface, MyInterface2 두개의 인터페이스를 구현하였다.
하지만 두 개의 인터페이스에는 동일한 이름의 default메소드가 충돌하였다.
따라서 Child클래스에서 디폴트 메소드 method1()을 오버라이딩해서 문제를 해결하였다.
또한, 상속받은 Parent클래스에서의 method2()와 MyInterface에서의 method2() 가 충돌되었지만,
조상클래스의 메소드가 상속되고, 디폴트 메소드는 무시되는 규칙이 적용되었다.
'JAVA > Basic' 카테고리의 다른 글
[JAVA-basic] 인터페이스(2) (0) | 2021.09.09 |
---|---|
[JAVA-basic] 인터페이스 (0) | 2021.08.31 |
[JAVA-basic] 추상클래스 (0) | 2021.08.27 |
[JAVA-basic] 다형성(2) (0) | 2021.08.24 |
[JAVA-basic] 다형성 (0) | 2021.08.24 |