KoreanFoodie's Study

8-2. 자바 인터페이스 : 인터페이스 상속, 디폴트 메소드와 인터페이스 확장 본문

Tutorials/Java

8-2. 자바 인터페이스 : 인터페이스 상속, 디폴트 메소드와 인터페이스 확장

GoldGiver 2021. 9. 15. 23:37

인터페이스 상속

인터페이스도 다른 인터페이스를 상속할 수 있다. 인터페이스는 클래스와는 달리 다중 상속을 허용한다. 다음과 같이 extends 키워드 뒤에 상속할 인터페이스드을 나열할 수 있다.

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {...}

하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드 뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 갖고 있어야 한다. 그렇기 때문에 구현 클래스로부터 객체를 생성하고 나서 다음과 같이 하위 및 상위 인터페이스 타입으로 변환이 가능하다.

하위인터페이스 변수 = new 구현클래스(...);
상위인터페이스1 변수 = new 구현클래스(...);
상위인터페이스2 변수 = new  구현클래스(...);

하위 인터페이스로 타입 변환이 되면 상/하위 인터페이스에 선언된 모든 메소드를 사용할 수 있으나, 상위 인터레이스로 타입 변환되면 상위 인터페이스에 선언된 메소드만 사용 가능하다.

다음 예제를 통해 확인해 보자.

package my_interface;

public interface InterfaceA 
{
	public void methodA();
}
package my_interface;

public interface InterfaceB 
{
	public void methodB();
}
package my_interface;

public interface InterfaceC extends InterfaceA, InterfaceB 
{
	public void methodC();
}
package my_interface;

public class ImplementationC implements InterfaceC {

	public void methodA()
	{
		System.out.println("Method A");
	}
	
	public void methodB()
	{
		System.out.println("Method B");
	}
	
	public void methodC()
	{
		System.out.println("Method C");
	}
}
package my_interface;

public class Example 
{
	public static void main(String[] args)
	{
		ImplementationC impl = new ImplementationC();
		
		InterfaceA ia = impl;
		ia.methodA();
		System.out.println();
		
		InterfaceB ib = impl;
		ib.methodB();
		System.out.println();
		
		InterfaceC ic = impl;
		ic.methodA();
		ic.methodB();
		ic.methodC();
		
	}
}

 

디폴트 메소드와 인터페이스 확장

디폴트 메소드는 인터페이스에 선언된 인스턴스 메소드이기 때문에 구현 객체가 있어야 사용할 수 있다.

 

디폴트 메소드의 필요성

인터페이스에서 디폴트 메소드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서이다. 기존 인터페이스의 이름과 추상 메소드의 변경 없이 디폴트 메소드만 추가할 수 있기 때문에 이전에 개발한 구현 클래스를 그대로 사용할 수 있으면서 새롭게 개발하는 클래스는 디폴트 메소드를 활용할 수 있다.

예를 들어, MyInterface라는 인터페이스와 이를 구현한 MyClassA라는 클래스가 있었다. MyInterface에 새로운 메소드를 추가했더니, MyClassA에서 새로운 메소드를 구현해야 한다는 에러가 발생했다. 이 경우, 디폴트 메소드를 선언하면 걱정없이 기존 MyClassA 클래스를 사용할 수 있다!

 

디폴트 메소드가 있는 인터페이스 상속

인터페이스 간에도 상속이 가능한테, 부모 인터페이스에 디폴트 메소드가 정의되어 있을 경우, 자식 인터페이스에서 디폴트 메소드를 활용하는 방법은 다음 세 가지가 있다.

1. 디폴트 메소드를 단순히 상속만 받는다.

2. 디폴트 메소드를 재정의(Override)해서 실행 내용을 변경한다.

3. 디폴트 메소드를 추상 메소드로 재선언한다.

이때, 3번처럼 추상 메소드로 재선언한 경우, 해당 인터페이스를 구현하는 클래스는 해당 추상 메소드를 구현해야 한다.


해당 포스팅은 이것이 자바다 (신용권 저) 를 참고하였습니다

 

Comments