1. Default Method의등장 배경
1.1기존의 Interface의 문제점

위 그림은 ClassA,ClassB,ClassC 총 3개의 클래스가 InterfaceA를 구현하고 있습니다.
이때 요구사항이 추가 되면서 interfaceA에 특정 추상 메서드 methodA를 추가해야 하는 상황이 발생했습니다.
인터페이스 원칙에 의해 ClassA~C 모두 methodA를 구현해야만 합니다.
클래스의 수가 적으면 상관 없겠지만 (상관없지 않음) 만약 아래와 같은 상황이 온다면 어떨까요?

classA~Z 모든 클래스 마다 methodA를 구현해줘야 합니다.
수많은 클래스들마다 methodA를 구현하면서 human mistake를 발생하지 않을 수 있을까요?
설상가상으로 methodA를 수정해야 한다면 어떨까요? 저는 눈앞이 벌써 깜깜해지는 느낌이네요..^^
그리고 이렇게 모든 클래스마다 methodA 를 구현 및 수정 하는 행위는 객체지향의 개방폐쇄원칙에 위배됩니다.
1.2 개방 폐쇄 원칙(OCP : Open Close Principle)
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
소프트웨어 구성 요소(커포넌트,클래스,모듈,함수)는 확장에 대해서는 개방(Open)되어야 하지만 변경에는 대해서는 폐쇄(CLOSE)되어야 한다는 의미라고 볼 수 있습니다.
이렇게 모든 클래스마다 methodA 를 구현 및 수정 하는 행위가 왜 OCP를 위반했을까요?
그 이유는 methodA가 interfaceA에 추가된다는 이유로 methodA를 사용하지 않는 모든 구현체에 methodA에 대한 구현을 해야하기 때문입니다.
즉, 기존의 코드가 변경되지 않고 기능 확장을 해야 위 원칙을 위배하지 하지 않기 위해 default method가 등장하게 됐습니다.
2. Default Method ?
2.1 default method 란?
default method는 인터페이스에 있는 구현 메서드를 의미합니다.
기존의 추상 메서드와 다른 점은
- 메서드 앞에 default 예약어를 붙인다.
- 구현부 {} 가 있어야 한다.
public interface Interface {
// 추상 메서드
void abstractMethodA();
void abstractMethodB();
void abstractMethodC();
// default 메서드
default int defaultMethodA(){
...
}
}
2.2 default method의 장점
1.1에서 언급한 문제 (인터페이스에 추상메서드를 추가하게 되면 모든 구현체에 대한 구현을 해야 함)를 인터페이스에 default method를 사용하면 추가 변경을 막을 수 있다.
즉, OCP(Open-Close-Principle)에서 확장에 개방(Open)되어 있고, 변경에 닫혀(Close)있는 코드를 설계할 수 있게 됩니다.
참고로 default method는 인터페이스를 구현한 클래스에서 코드를 구현할 필요가 없을 뿐이지, 구현을 할 수 없는 것이 아닙니다.
인터페이스를 구현하는 클래스에서 default method를 재정의할 수 있으니 필요에 따라 재정의 하여 사용하면 됩니다!
마치며
Java 8에서 도입된 디폴트 메서드에 대해 알아보았습니다.
자바로 2년 넘게 개발을 해오면서 default method에 대한 정의를 내리지 못했는데요..?
오늘을 기점으로 default 메서드에 대해 확실하게 인지하였고
지나가는 아무나 저한테 default 메서드가 뭔지 물어봐주면 좋겠다는 생각이 드네요 ㅎㅎㅎ
오늘을 기점으로 Java 8 이후에 등장한 것들에 대한 포스팅을 해보려고 합니다. 자바 딱 대~
출처
https://velog.io/@heoseungyeon/%EB%94%94%ED%8F%B4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9CDefault-Method
#default_method #java8
'Dev > Java' 카테고리의 다른 글
| Java Streams (1) - 스트림 생성하기 👀 (0) | 2022.12.27 |
|---|---|
| [Java] JVM 메모리 구조 (0) | 2022.12.05 |
| [Java] Garbage Collection(가비지 컬렉션) 톺아보기 (1) | 2022.10.02 |
| [JAVA] 메모리 누수(Memory Leak) (0) | 2022.09.18 |
| 쓰레드 동기화 (Thread Synchronization) (0) | 2022.08.06 |