인터페이스 역시, 클래스와 마찬가지로 다른 인터페이스를 상속할 수 있습니다. 주의할 것은 구현 클래스가 아니라 인터페이스 자체가 다른 인터페이스를 상속한다는 점입니다. 인터페이스 역시 extends 키워드를 통해 다른 인터페이스를 상속할 수 있고, 중요한 점은 인터페이스는 클래스와 달리 다중 상속이 가능하다는 것입니다. 기존에는 부모 / 자식 클래스로 통칭했는데, 인터페이스는 상위 / 하위 인터페이스로 각각의 호칭을 지정하겠습니다.
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2... {
//...
}
상속이 발생하므로, 당연하겠지만 다형성의 특질을 갖게 됩니다. 예를 들어서 위에서 예시로 든 '하위인터페이스'를 구현하는 '구현클래스'가 있다고 가정하겠습니다. 이 '구현클래스'는 반드시 '하위인터페이스' 뿐만 아니라 '상위인터페이스1', '상위인터페이스2'... 모두의 추상 메서드에 대해서 오버라이드하여 구현을 해야만 합니다.
그렇다면 해당 '구현클래스' 인스턴스를 생성한다면, 이는 상속에서의 다형성의 특질을 그대로 적용해 타입 변환이 가능하게 됩니다. 어떤 뜻인지 살짝 헷갈리신다면, 아래의 코드를 보시기 바랍니다.
하위인터페이스 변수 = new 구현클래스();
상위인터페이스1 변수 = new 구현클래스();
상위인터페이스2 변수 = new 구현클래스();
해당 '구현클래스' 인스턴스는 '상위인터페이스1', '상위인터페이스2' 모두의 필수 조건인 추상 메서드를 구현하고 있기 때문에 부모 타입 인터페이스로도 형변환이 가능하다는 것이죠. 클래스의 상속에서 적용되었던 개념이 인터페이스에서도 똑같이 적용되는 것입니다.
그럼 당연하겠지만, 해당 '구현클래스' 인스턴스를 '하위인터페이스'로 타입 변환하게 된다면 모든 추상 메서드를 사용할 수 있습니다. 그러나 '상위인터페이스1'이나 '상위인터페이스2'로 타입을 변환하게 되면, 하위 인터페이스에서만 선언된 메서드들은 사용할 수 없게 되겠죠?
위의 설명을 예제를 통해서 살펴보도록 하겠습니다. 세 개의 인터페이스 InterfaceX / InterfaceY / InterfaceZ가 있다고 가정하겠습니다. 그리고 여기서 하위 인터페이스는 InterfaceZ가 되고 이 인터페이스는 InterfaceX와 InterfaceY를 상속하는 구조를 갖게 됩니다. 참고로 InterfaceX와 InterfaceY는 각각 독립되의 동일한 레벨의 인터페이스입니다. InterfaceZ가 병렬로 다중 상속을 하는 것이죠. 각각의 인터페이스는 methodX / methodY / methodZ를 갖고 있습니다.
public interface InterfaceX {
public void methodX();
}
public interface InterfaceY {
public void methodY();
}
public interface InterfaceZ extends InterfaceX, InterfaceY {
public void methodZ();
}
public class ImplementationZ implements InterfaceZ {
public void methodX() {
System.out.println("methodX 실행");
}
public void methodY() {
System.out.println("methodY 실행");
}
public void methodZ() {
System.out.println("methodZ 실행");
}
}
public class ExampleMain {
public static void main(String[] args) {
InterfaceX ix = new ImplementationZ();
ix.methodX();
System.out.println();
InterfaceY iy = new ImplementationZ();
iy.methodY();
System.out.println();
InterfaceZ iz = new ImplementationZ();
iz.methodX();
iz.methodY();
iz.methodZ();
}
}
/* 출력
methodX 실행
methodY 실행
methodX 실행
methodY 실행
methodZ 실행
*/
'Programming > JAVA' 카테고리의 다른 글
인터페이스(13) - 디폴트 메서드가 있는 인터페이스의 상속 (0) | 2023.03.30 |
---|---|
인터페이스(12) - 디폴트 메서드와 인터페이스의 확장 (0) | 2023.03.29 |
인터페이스(10) - 객체 타입체크(instanceof) (0) | 2023.03.27 |
인터페이스(9) - 인터페이스 파라미터의 다형성 & Casting (0) | 2023.03.26 |
인터페이스(8) - 인터페이스의 타입 변환과 다형성 3(배열 객체) (0) | 2023.03.25 |