java 8 이 등장하면서 인터페이스(Interface) 개념에 디폴트 메서드(default method)를 사용할 수 있게 되었습니다. 원래 기존의 인터페이스는 추상 메서드만 존재할 수 있었고 이를 상속받는 구현체에서 직접 해당 추상 메서드를 구현했어야만 했는데요. 과연 디폴트 메서드가 기존의 인터페이스에 어떤 변화를 가져다 주었을까요❓
기존의 Interface가 어떤 잘못을 했길래 default method라는 개념이 도입되게 되었을까요?
한가지 상황을 가정해보겠습니다.
위 그림은 ClassA, ClassB, ClassC 총 3개의 클래스가 InterfaceA를 구현하고 있습니다.
이때, 요구사항이 추가되면서 InterfaceA에 특정 추상 메서드 methodA를 추가해야된다고 생각해봅시다.
그러면 인터페이스 원칙에 의해 ClassA, ClassB, ClassC에 모두 methodA 를 구현 해야할 것입니다.
어? 그러면 그냥 구현하면 되잖아! 3개밖에 없는데? 라고 생각할 수도 있습니다.
그러면 다음과 같은 상황에도 그런 생각이 들 수 있을까요?
다음과 같이 InterfaceA를 상속받는 무수히 많은 클래스가 있습니다.
그러면 일일이 모든 InterfaceA의 구현체 클래스에 추가되는 메서드 methodA를 구현해줘야 합니다.
객체지향 설계 5대 원칙 중 하나인 개방 폐쇄 원칙(OCP) 가 있습니다.
개방-폐쇄 원칙 (Open/closed principle)이란?
“소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.”
소프트웨어 구성 요소(컴포넌트, 클래스, 모듈, 함수)는 확장에 대해서는 개방(OPEN)되어야 하지만 변경에 대해서는 폐쇄(CLOSE)되어야 한다는 의미라고 볼 수 있습니다.
근데 왜 갑자기 개방 폐쇄 원칙을 언급하는걸까요? 🤔
위와 같은 경우, 확장은 할 수 있지만(OPEN) 변경에 대한 폐쇄(CLOSE)를 위반한 케이스라고 볼 수 있습니다.
그 이유는 methodA가 InterfaceA에 추가된다는 이유로 methodA를 사용하지 않는 모든 구현체에 methodA에 대한 구현을 해야 하기 때문입니다.
즉, 기존의 코드가 변경되지 않고 기능 확장을 해야 위 원칙을 지킬 수 있을 것입니다.
default method는 인터페이스에 있는 구현 메서드를 의미합니다.
기존의 추상 메서드와 다른 점은
default
예약어를 붙인다.{}
가 있어야 한다.default method Interface 예제 코드
public interface Interface {
// 추상 메서드
void abstractMethodA();
void abstractMethodB();
void abstractMethodC();
// default 메서드
default int defaultMethodA(){
...
}
}
다음과 같이 default method가 등장하면서 위에서 다뤘던 문제점을 해결할 수 있습니다.
문제점 : 인터페이스에 추상메서드를 추가하게 되면 모든 구현체에 구현을 해야한다.
해결 방안 : 인터페이스에 default method를 사용하면 추가 변경을 막을 수 있다.
이로써 OCP(Open-Close-Principle : 개방 폐쇄 원칙) 에서 확장에 개방(Open)되어 있고, 변경에 닫혀(Close)있는 코드를 설계할 수 있게 됩니다.
default method를 사용하면 크게 2가지 충돌 상황이 발생할 수 있습니다.
default method는 인터페이스를 구현한 클래스에서 코드를 구현할 필요가 없을 뿐이지, 구현을 할 수 없는 것이 아닙니다.
즉, 인터페이스를 구현하는 클래스에서 default method를 재정의할 수 있습니다.
따라서, 위와 같은 충돌 상황이 일어나는 클래스에서 defalt method를 재정의하면 충돌 상황을 해결할 수 있습니다.
이번 시간엔 Java 8 에 등장한 default method 에 대해서 알아봤습니다. default method가 등장하면서 객체지향 설계를 더욱 유연하게 할 수 있게 된 것 같습니다. 한편으론 Java8 이전까지는 Java에서 인터페이스(Interface)의 규칙을 너무 단순화할려고 고집부린거지 않을까..?라는 생각도 했지,,,
이전엔 단순히 default method 라는게 있구나~ 정도였지만 조사를 하면서 이게 OCP 원리와도 연관이 있구나 알게되는 계기가 되었던 학습인 것 같습니다 😁
[자바의 정석 - 기초편] 7-40,41 디폴트 메서드와 static메서드에 대한 강의입니다. 객체지향개념의 마지막 강의
[객체지향] OCP (개방 폐쇄의 원칙 : Open Close Principle)
SOLID (객체 지향 설계) - 위키백과, 우리 모두의 백과사전