본문으로 바로가기

[Java] 인터페이스 상속

category Backend/Java 2022. 4. 25. 12:49

인터페이스 상속

  • 인터페이스끼리 상속이 가능합니다.
  • 인터페이스는 클래스와 달리 다중 상속을 허용합니다.
public interface 인터페이스명 extends 인터페이스1, 인터페이스2, ... {
	...
}

 

예시 1

하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드뿐만 아니라 

상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 합니다.

 

인터페이스 A

public interface A {
    void methodA();
}

 

인터페이스 B

public interface B {
    void methodB();
}

 

인터페이스 A와 B를 상속받은 인터페이스 C

public interface C extends A, B {
    void methodC();
}

 

구현체(구현 클래스) CImpl

public class CImpl implements C {
    @Override
    public void methodA() {
        System.out.println("method A");
    }

    @Override
    public void methodB() {
        System.out.println("method B");
    }

    @Override
    public void methodC() {
        System.out.println("method C");
    }
}

 

실행

C c = new CImpl();
c.methodA(); // method A
c.methodB(); // method B
c.methodC(); // method C

 

예시 2

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

C c = new CImpl();
c.methodA();
c.methodB();
c.methodC();

A a = c;
a.methodA();
// a.methodB(); (x)
// a.methodC(); (x)

B b = c;
// b.methodA(); (x)
b.methodB();
// b.methodC(); (x)

 

예시 3

추상 메소드를 하나라도 구현하지 않을 경우 추상 클래스로 선언 필요 (주의)

public abstract class CImpl implements C {
    @Override
    public void methodA() {
        System.out.println("method A");
    }

    @Override
    public void methodB() {
        System.out.println("method B");
    }

//    @Override
//    public void methodC() {
//        System.out.println("method C");
//    }
}