회원가입

인터페이스 - 다중 구현

Beany 2024-10-31

ChatGPT 요약

자바는 다중 상속을 지원하지 않지만 인터페이스의 다중 구현은 허용된다. 다중 상속은 다이아몬드 문제와 복잡한 클래스 계층 구조를 초래할 수 있기 때문에 자바에서는 허용하지 않는다. 반면 인터페이스는 모두 추상 메서드로 구성되어 있어 다중 구현을 허용한다. 이는 구현 클래스에서 각 인터페이스의 메서드를 모두 구현해주면 되며, 다이아몬드 문제가 발생하지 않는다. 따라서 인터페이스의 다중 구현은 다중 상속의 문제를 효과적으로 우회할 수 있는 방법이다.

인터페이스 - 다중 구현


자바가 다중 상속을 지원하지 않은 이유 - 복습

자바는 다중 상속을 지원하지 않는다. 그래서 extend 대상은 하나만 선택할 수 있다. 부모를 하나만 선택할 수 있다는 뜻이다. 물론 부모가 또 부모를 가지는 것은 괜찮다.

 

다중 상속 그림

만약 비행기와 자동차를 상속 받아서 하늘을 나는 자동차를 만든다고 가정해보자. 만약 그림과 같이 다중 상속을 사용하게 되면 AirplaneCar 입장에서 move() 를 호출할 때 어떤 부모의 move() 를 사용해야 할지 애매한 문제가 발생한다. 이것을 다이아몬드 문제라 한다.
그리고 다중 상속을 사용하면 클래스 계층 구조가 매우 복잡해질 수 있다. 이런 문제점 때문에 자바는 클래스의 다중 상속을 허용하지 않는다. 대신에 인터페이스의 다중 구현을 허용하여 이러한 문제를 피한다.

 

클래스는 앞서 설명한 이유로 다중 상속이 안되는데, 인터페이스의 다중 구현은 허용한 이유는 뭘까?
인터페이스는 모두 추상 메서드로 이루어져 있기 때문이다.

 

다음 예제를 보자.

인터페이스 다중 구현 그림

InterfaceA, InterfaceB 는 둘다 같은 methodCommon() 을 가지고 있다. 그리고 Child 는 두 인터페이스를 구현했다. 상속 관계의 경우 두 부모 중에 어떤 한 부모의 methodCommon() 을 사용해야 할지 결정해야 하는 다이아몬드 문제가 발생한다.
하지만 인터페이스 자신은 구현을 가지지 않느다. 대신에 인터페이스를 구현하는 곳에서 해당 기능을 모두 구현해야 한다. 여기서 InterfaceA, InterfaceB 는 같은 이름의 methodCommon() 를 제공하지만 이것의 기능은 Child 가 구현한다. 그리고 오버라이딩에 의해 어차피 Child 에 있는 methodCommon() 이 호출된다. 결과적으로 두 부모 중에 어떤 한 부모의 methodCommon() 을 선택하는 것이 아니라 그냥 인터페이스들을 구현한 Child에 있는 methodCommon() 이 사용된다. 이런 이유로 인터페이스는 다이아몬드 문제가 발생하지 않는다. 따라서 인터페이스의 경우 다중 구현을 허용한다.

 

예제 코드로 작성해보자.

package poly.ex6;

public interface InterfaceA {
    void methodA();
    void methodCommon();
}
package poly.ex6;

public interface InterfaceB {
    void methodB();
    void methodCommon();
}
package poly.ex6;

public class Child implements InterfaceA, InterfaceB {
    public void methodA() {
        System.out.println("methodA() 호출됨");
    }

    public void methodB() {
        System.out.println("methodB() 호출됨");
    }

    public void methodCommon() {
        System.out.println("methodCommon() 호출됨");
    }
}

 

0 0
JAVA
이 공간은 개인 공부를 통해 얻은 정보를 체계적으로 정리하고 공유하는 곳입니다. 학습한 내용, 발견한 지식, 그리고 문제 해결 방법 등을 기록하여 나만의 학습 자료를 구축하고, 필요할 때 쉽게 참고할 수 있는 유용한 자원으로 활용할 수 있도록 합니다.
Yesterday: 456
Today: 144