디폴트 메서드 : 인터페이스 내에서 구현 코드를 가진 메서드
추상 메서드 : 선언만 있고 구현이 없는 메서드
예시 :
interface MyInterface {
// 추상 메서드
void abstractMethod();
// 디폴트 메서드
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
// MyInterface를 구현하는 클래스
class MyClass implements MyInterface {
@Override
public void abstractMethod() {
System.out.println("Abstract method implementation.");
}
}
public class Main {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.abstractMethod(); // "Abstract method implementation." 출력
myClass.defaultMethod(); // "This is a default method." 출력
}
}
과거에는 모든 인터페이스의 메서드가 추상 메서드 이어야 했지만 이제는 디폴트 메서드의 도입으로 인해 인터페이스에 메서드의 기본 구현을 제공할 수 있게 되었다. 기존 인터페이스에 메서드를 추가하는 길이 열렸지만 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. 디폴트 메서드는 범용적이라 대부분 상황에서 잘 작동한다.
하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다.
즉 디폴트 메서드라는 도구가 생겼더라도 인터페이스를 설계할 때는 세심한 주의를 기울여야 한다. 디폴트 메서드는 꼭 필요한 경우가 아니면 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는일을 피해야 한다. 추가할경우 디폴트 메서드가 기준 구현체들과 충돌하는지도 체크해야 한다. 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아니다. 새로운 인터페이스를 만들 경우 표준적인 메서드 구현을 제공할때는 아주 유용한 수단이다.
새 인터페이스라면 릴리스 전 반드시 테스트를 거쳐야 한다. 최소 세가지는 구현해봐야 한다. 각 인터페이스의 인스턴스를 다양한 작업에 활용하는 클라이언트도 여러 개 만들어봐야 한다. 릴리스하기 전, 즉 바로잡을 기회가 아직 남아있을 때 결함을 찾아내야 한다. 인터페이스를 릴리스한 후라도 결함을 수정하는게 가능한 경우도 있지만 어려운 방법이니 피하자.
'이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (2) | 2024.03.22 |
---|---|
[이펙티브 자바] 아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2024.03.22 |
[이펙티브 자바] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 (0) | 2024.03.21 |
[이펙티브 자바] 아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2024.03.21 |
[이펙티브 자바] 아이템 18. 상속보다는 컴포지션을 사용하라 (0) | 2024.03.21 |