본문 바로가기

Programming/JAVA

인터페이스(12) - 디폴트 메서드와 인터페이스의 확장

java logo image

 

 

디폴트 메서드를 배웠던 것을 기억하실 것입니다. 디폴트 메서드는, 기본적으로 인터페이스에서 선언되는 추상 메서드와 달리 메서드의 실행 코드까지 모두 선언되는 메서드였습니다. 

 

선언은 인터페이스에서 되어 있지만, 실제로 실행은 구현 객체를 통해서 이루어지는 독특한 성질을 갖고 있다는 것도 설명했습니다. 인터페이스로서는 상당히 예외적이고 특이한 케이스입니다. 다만 별다른 조작 없이 구현 클래스 인스턴스를 통해서 인터페이스 객체에서 실행 가능하다는 기본 메서드로서의 장점은 있지만 - 정확히 이 디폴트 메서드가 왜 필요한지에 대해서 상세히 살펴보도록 하겠습니다. 

 

 


 

 

 

인터페이스에 선언된 디폴트 메서드의 가장 기본적인 특징은, 구현 클래스에서 오버라이드를 의무적으로 하지 않아도 된다는 점입니다. 이 특성은, 인터페이스의 코드 수정이 발생할 때 강력한 편의성을 발휘하게 됩니다. 

 

예를 들어 인터페이스 ExInterface가 있고, 이를 구현하는 클래스 ExClassX가 있다고 가정하겠습니다. ExInterface에는 추상 메서드 method1( )이 선언되어 있습니다. 그럼 당연히 ExClassX에서는 method1( )을 오버라이드하여 재정의 해두었을 것입니다. 

 

그런데 인터페이스에 method2( )가 새로 추가되어야 하는 이슈가 생겼다고 해봅시다. 그럼 어떻게 작업이 이루어져야 할까요? 일단 ExInterface에 추상 메서드 method2( )가 선언되어야 할 것입니다. 그런데, 이는 추상 메서드이기 때문에 ExClassX에 method2( ) 오버라이드 작업이 이뤄지지 않으면 에러가 발생합니다. 

 

간단한 작업 같긴 하지만, 실제로 ExClassX에 손을 대지 못하는 상황이 있을 수도 있고 실수가 발생할 수도 있습니다. 혹은 해당 메서드가 ExClassX 외에 10여 개의 클래스에서도 적용되어야 한다면? 일일이 구현 작업을 진행해야 합니다. 모든 구현 클래스가 공통적으로 동작할 필요가 있다면, 동일한 작업을 수십 번 반복해야 하죠.

 

이럴 때 인터페이스에 method2( )를 디폴트 메서드로 선언하게 된다면, 문제는 간단하게 해결됩니다. 디폴트 메서드로 새롭게 선언된다면, 기존의 구현 클래스에 별도로 선언 작업 없이 바로 실행 코드만 추가하면 되니까요.

 

예제를 통해서 살펴보겠습니다. 

 

 


 

public interface ExInterface {
	public void method1();
	public default void method2() {
		System.out.println("ExInterface가 method2 디폴트 실행");
	}
}

 

public class ExClassX implements ExInterface {
	@Override
	public void method1() {
		System.out.println("ExClassX가 method1을 실행");
	}
}

 

public class ExClassY implements ExInterface {
	@Override
	public void method1() {
		System.out.println("ExClassY가 method1을 실행");
	}
	
	@Override
	public void method2() {
		System.out.println("ExClassY가 mehotd2 재정의하여 실행");
	}
}

 

public class ExampleMain {	
	public static void main(String[] args) {
		ExInterface ei1 = new ExClassX();
		ei1.method1();
		ei1.method2();
		
		ExInterface ei2 = new ExClassY();
		ei2.method1();
		ei2.method2();
	}
}

/* 출력
ExClassX가 method1을 실행
ExInterface가 method2 디폴트 실행
ExClassY가 method1을 실행
ExClassY가 mehotd2 재정의하여 실행
*/