본문 바로가기

Java 길찾기/이것이 자바다

[Java] 인터페이스 상속

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

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

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

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

하위 인터페이스로 타입 변환이 되면 상위, 하위 인터페이스에 선언된 모든 메소드를 사용할 수 있으나, 상위 인터페이스로 타입 변환되면 상위 인터페이스에 선언된 메소드만 사용 가능하고 하위 인터페이스에 선언된 메소드는 사용할 수 없다. 다음 예제를 통해 확인해보자.

// InterfaceA.java -- 상위 인터페이스
public interface InterfaceA {
    public void methodA();
}
// InterfaceB.java -- 상위 인터페이스
public interface InterfaceB {
    public void methodB();
}
// InterfaceC.java -- 하위 인터페이스
public interface InterfaceC extends InterfaceA, InterfaceB {
    public void methodC();
}
// ImplementationC.java
public class ImplementationC implements InterfaceC {
    public void methodA() {
        System.out.println("ImplementationC-methodA() 실행");
    }
    
    public void methodB() {
        System.out.println("ImplementationC-methodB() 실행");
    }
    
    public void methodC() {
        System.out.println("ImplementationC-methodC() 실행");
    }
}
// Example.java
public class Example {
    public static void main(String[] args) {
        ImplementationC impl = new ImplementationC();
        
        InterfaceA ia = impl;
        ia.methodA(); // InterfaceA 변수는 methodA() 만 호출 가능
        System.out.println(); // 공백
        
        InterfaceB ib = impl;
        ib.methodB(); // InterfaceB 변수는 methodB() 만 호출 가능
        System.out.println(); // 공백
        
        InterfaceC ic = impl; // InterfaceC 변수는 모두 호출 가능
        ic.methodA();
        ic.methodB();
        ic.methodC();
    }
}