디폴트 메서드(Default Method)

HeoSeungYeon·2021년 9월 13일
3

Java Study

목록 보기
9/9
post-thumbnail

개요


java 8 이 등장하면서 인터페이스(Interface) 개념에 디폴트 메서드(default method)를 사용할 수 있게 되었습니다. 원래 기존의 인터페이스는 추상 메서드만 존재할 수 있었고 이를 상속받는 구현체에서 직접 해당 추상 메서드를 구현했어야만 했는데요. 과연 디폴트 메서드가 기존의 인터페이스에 어떤 변화를 가져다 주었을까요❓

0. Default Method의 등장 배경


0-1. 기존 Interface의 문제점


기존의 Interface가 어떤 잘못을 했길래 default method라는 개념이 도입되게 되었을까요?

한가지 상황을 가정해보겠습니다.

위 그림은 ClassA, ClassB, ClassC 총 3개의 클래스가 InterfaceA를 구현하고 있습니다.

이때, 요구사항이 추가되면서 InterfaceA에 특정 추상 메서드 methodA를 추가해야된다고 생각해봅시다.

그러면 인터페이스 원칙에 의해 ClassA, ClassB, ClassC에 모두 methodA 를 구현 해야할 것입니다.

어? 그러면 그냥 구현하면 되잖아! 3개밖에 없는데? 라고 생각할 수도 있습니다.

그러면 다음과 같은 상황에도 그런 생각이 들 수 있을까요?

다음과 같이 InterfaceA를 상속받는 무수히 많은 클래스가 있습니다.

그러면 일일이 모든 InterfaceA의 구현체 클래스에 추가되는 메서드 methodA를 구현해줘야 합니다.

0-2. 개방 폐쇄 원칙 (OCP : Open Close Principle)


객체지향 설계 5대 원칙 중 하나인 개방 폐쇄 원칙(OCP) 가 있습니다.

개방-폐쇄 원칙 (Open/closed principle)이란?

“소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.”

소프트웨어 구성 요소(컴포넌트, 클래스, 모듈, 함수)는 확장에 대해서는 개방(OPEN)되어야 하지만 변경에 대해서는 폐쇄(CLOSE)되어야 한다는 의미라고 볼 수 있습니다.

근데 왜 갑자기 개방 폐쇄 원칙을 언급하는걸까요? 🤔

위와 같은 경우, 확장은 할 수 있지만(OPEN) 변경에 대한 폐쇄(CLOSE)를 위반한 케이스라고 볼 수 있습니다.

그 이유는 methodAInterfaceA에 추가된다는 이유로 methodA를 사용하지 않는 모든 구현체에 methodA에 대한 구현을 해야 하기 때문입니다.

즉, 기존의 코드가 변경되지 않고 기능 확장을 해야 위 원칙을 지킬 수 있을 것입니다.

1. Default Method


1-1. default method 개념


default method는 인터페이스에 있는 구현 메서드를 의미합니다.

기존의 추상 메서드와 다른 점은

  • 메서드 앞에 default 예약어를 붙인다.
  • 구현부 {} 가 있어야 한다.

default method Interface 예제 코드


public interface Interface {
   // 추상 메서드 
    void abstractMethodA();
    void abstractMethodB();
    void abstractMethodC();

	// default 메서드
    default int defaultMethodA(){
    	...
    }
}

1-2. default method의 장점


다음과 같이 default method가 등장하면서 위에서 다뤘던 문제점을 해결할 수 있습니다.

문제점 : 인터페이스에 추상메서드를 추가하게 되면 모든 구현체에 구현을 해야한다.

해결 방안 : 인터페이스에 default method를 사용하면 추가 변경을 막을 수 있다.

이로써 OCP(Open-Close-Principle : 개방 폐쇄 원칙) 에서 확장에 개방(Open)되어 있고, 변경에 닫혀(Close)있는 코드를 설계할 수 있게 됩니다.

1-3. default method 간 충돌


default method를 사용하면 크게 2가지 충돌 상황이 발생할 수 있습니다.

  1. 여러 인터페이스의 디폴트 메서드 간의 충돌
  2. 디폴트 메서드와 상위 클래스의 메서드 간의 충돌

default method는 인터페이스를 구현한 클래스에서 코드를 구현할 필요가 없을 뿐이지, 구현을 할 수 없는 것이 아닙니다.

즉, 인터페이스를 구현하는 클래스에서 default method재정의할 수 있습니다.

따라서, 위와 같은 충돌 상황이 일어나는 클래스에서 defalt method재정의하면 충돌 상황을 해결할 수 있습니다.

2. 회고


이번 시간엔 Java 8 에 등장한 default method 에 대해서 알아봤습니다. default method가 등장하면서 객체지향 설계를 더욱 유연하게 할 수 있게 된 것 같습니다. 한편으론 Java8 이전까지는 Java에서 인터페이스(Interface)의 규칙을 너무 단순화할려고 고집부린거지 않을까..?라는 생각도 했지,,,

이전엔 단순히 default method 라는게 있구나~ 정도였지만 조사를 하면서 이게 OCP 원리와도 연관이 있구나 알게되는 계기가 되었던 학습인 것 같습니다 😁

참고문서


[자바의 정석 - 기초편] 7-40,41 디폴트 메서드와 static메서드에 대한 강의입니다. 객체지향개념의 마지막 강의

[객체지향] OCP (개방 폐쇄의 원칙 : Open Close Principle)

SOLID (객체 지향 설계) - 위키백과, 우리 모두의 백과사전

자바 인터페이스(Interface), 디폴트 메서드와 static 메서드

[Java] 자바8 default, static 메소드

0개의 댓글