본문 바로가기
Language/Java

[JAVA] Java 인터페이스 간의 상속이 가능한가요? 다중 상속의 해법과 설계 원칙

by Papa Martino V 2026. 1. 17.
728x90

인터페이스 간의 상속
인터페이스 간의 상속

 

자바(Java)를 학습하는 과정에서 많은 개발자가 직면하는 흥미로운 질문 중 하나가 바로 "인터페이스도 상속이 가능한가?"입니다. 클래스 간의 상속(Extends)은 익숙하지만, 인터페이스 사이의 관계에 대해서는 의외로 혼동을 겪는 경우가 많습니다. 결론부터 말씀드리면, Java에서 인터페이스 간의 상속은 가능하며, 심지어 클래스에서는 허용되지 않는 '다중 상속'까지 지원합니다. 이번 포스팅에서는 인터페이스 상속의 메커니즘과 이것이 왜 중요한지, 그리고 실무 설계에서 어떻게 활용되는지 심층적으로 분석해 보겠습니다.


1. 인터페이스 상속의 핵심: extends 키워드

흔히 인터페이스를 클래스에서 구현할 때는 implements 키워드를 사용합니다. 하지만 인터페이스가 다른 인터페이스를 확장할 때는 클래스와 동일하게 extends 키워드를 사용합니다. 인터페이스 상속은 하위 인터페이스가 상위 인터페이스의 모든 추상 메서드를 상속받는 것을 의미합니다. 이를 통해 공통된 행위(Behavior)를 계층화하여 관리할 수 있습니다.


interface Animal {
    void eat();
}

interface Runnable extends Animal {
    void run();
}

 

위 코드에서 Runnable 인터페이스를 구현하는 클래스는 run() 메서드뿐만 아니라 상위 인터페이스인 Animaleat() 메서드까지 모두 구현해야 하는 의무를 가지게 됩니다.


2. 클래스와의 결정적 차이: 다중 상속(Multiple Inheritance)

Java의 클래스는 '다중 상속'을 지원하지 않습니다. 두 개 이상의 부모 클래스를 상속받을 때 발생할 수 있는 다이아몬드 문제(Diamond Problem) 때문입니다. 부모 클래스들이 동일한 이름의 메서드를 가지고 있다면, 자식 클래스에서 어떤 것을 호출해야 할지 모호해지기 때문이죠. 하지만 인터페이스는 다중 상속이 가능합니다. 인터페이스는 기본적으로 '구현부(Body)'가 없는 추상 메서드만을 가지기 때문에, 여러 부모 인터페이스로부터 동일한 시그니처의 메서드를 상속받더라도 구현체 클래스에서 한 번만 정의하면 모호성이 해결됩니다.


3. 인터페이스 상속 vs 클래스 상속 비교

이해를 돕기 위해 클래스 상속과 인터페이스 상속의 차이점을 표로 정리하였습니다.

구분 클래스 상속 (Class Inheritance) 인터페이스 상속 (Interface Inheritance)
사용 키워드 extends extends
상속 가능 개수 단일 상속만 가능 (1개) 다중 상속 가능 (N개)
목적 기능 확장 및 재사용 (Is-a 관계) 행위의 규약 및 타입 계층화 (Can-do 관계)
상태(필드) 상속 인스턴스 변수 상속 가능 상수(public static final)만 가능
모호성 위험 높음 (다이아몬드 문제 발생) 매우 낮음 (구현체에서 결정)

4. 실무적 관점: 왜 인터페이스 상속을 사용하는가?

인터페이스 상속은 단순히 코드를 줄이는 수단이 아닙니다. 객체지향 설계 원칙인 SOLIDISP(Interface Segregation Principle, 인터페이스 분리 원칙)를 지키면서도 시스템의 유연성을 확보하는 데 필수적입니다.

  • 모듈화: 거대한 인터페이스를 만들기보다, 작고 명확한 단위의 인터페이스를 정의하고 필요한 경우 이를 상속받아 조합함으로써 재사용성을 극대화합니다.
  • 다형성 확장: 특정 인터페이스를 상속받은 하위 인터페이스 타입을 사용함으로써, 런타임에 더 넓은 범위의 객체를 유연하게 수용할 수 있습니다.
  • API 버전 관리: 기존 인터페이스를 수정하지 않고, 이를 상속받은 새 인터페이스를 만들어 새로운 기능을 추가함으로써 하위 호환성을 유지할 수 있습니다.

5. 주의사항: Default Method와 다중 상속

Java 8 이후부터 인터페이스에 default 메서드(구현부가 있는 메서드)가 도입되면서 인터페이스 상속에서도 다이아몬드 문제와 유사한 충돌이 발생할 수 있게 되었습니다. 만약 상속받은 두 인터페이스에 동일한 default 메서드가 존재한다면, 개발자는 해당 메서드를 반드시 오버라이딩(Overriding)하여 충돌을 직접 해결해야 합니다.


결론

Java에서 인터페이스 간의 상속은 시스템의 결합도를 낮추고 유연성을 높이는 강력한 도구입니다. 클래스 상속의 한계인 다중 상속을 우아하게 해결하며, 타입의 계층 구조를 명확하게 설계할 수 있게 해줍니다. 훌륭한 자바 개발자가 되기 위해서는 단순히 '기능의 구현'을 넘어, 이러한 인터페이스 계층 구조를 어떻게 설계할 것인지에 대한 고민이 반드시 필요합니다.


참고 문헌 및 출처

  • Oracle Java Documentation: Inheritance in Interfaces
  • James Gosling, The Java Programming Language, Addison-Wesley
  • Joshua Bloch, Effective Java 3rd Edition, Pearson
728x90