Java의 정석
디폴트 메서드와 static 메서드
donghyeob.k
2022. 4. 25. 20:13
인터페이스에 추상 메서드만 선언할 수 있었으나 JDK1.8부터 디폴트 메서드와 static 메서드도 추가할 수 있게 되었다.
static 메서드는 인스턴스와 관계가 없는 독립적인 메서드이기 때문에 인터페이스에 추가하지 못할 이유가 없지만 규칙을 단순히 할 필요가 있어서 인터페이스의 모든 메서드는 추상 메서드여야 한다는 규칙에 예외를 두지 않았다.
조상 클래스에 새로운 메서드를 추가하는 것은 별 일이 아니지만 인터페이스에 메서드를 추가한다는 것은 추상 메서드를 추가한다는 것이고 이 인터페이스를 구현한 기존의 모든 클래스들이 새로 추가된 메서드를 구현해야 한다.
디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드로 추상 메서드가 아니기 때문에 디폴트 메서드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.
1. interface MyInterface {
void method();
void newMethod();
}
2. interface MyInterface {
void method();
default void newMethod() {};
}
2번 코드와 같이 디폴트 메서드를 추가하면 기존의 MyInterface를 구현한 클래스를 변경하지 않아도 된다.
새로 추가된 디폴트 메서드가 기존의 메서드와 이름이 중복되어 충돌하는 경우가 발생하는데 충돌을 해결하기 위한 규칙은 아래와 같다.
- 여러 인터페이스의 디폴트 메서드 간의 충돌 - 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
- 디폴트 메서드와 조상 클래스의 메서드 간의 충돌 - 조상 클래스의 메서드가 상속되고 디폴트 메서드는 무시된다.