본문 바로가기
Language/Java

[JAVA] 자바가 다중 상속을 포기하고 '순수성'을 선택한 진짜 이유

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

Java 다중 상속을 지원하지 않는 이유
Java 다중 상속을 지원하지 않는 이유

 

객체지향 프로그래밍(OOP)을 처음 접하는 학습자들에게 "왜 자바는 클래스의 다중 상속을 지원하지 않을까?"라는 질문은 매우 고전적이면서도 날카로운 질문입니다. C++과 같은 언어에서는 가능한 기능이 왜 현대 프로그래밍의 표준이라 불리는 자바에서는 금지되었을까요? 단순히 기술적 한계 때문일까요, 아니면 설계 철학의 산물일까요? 오늘 그 이면의 깊은 이유를 파헤쳐 봅니다.


1. 다중 상속의 치명적 함정: 다이아몬드 문제(The Diamond Problem)

자바 설계자들이 다중 상속을 배제한 가장 결정적인 이유는 바로 '다이아몬드 문제'라 불리는 구조적 모호성 때문입니다. 이는 두 개 이상의 부모 클래스가 동일한 이름의 메서드를 가지고 있을 때, 자식 클래스에서 어떤 메서드를 호출해야 할지 결정할 수 없는 혼란을 의미합니다.

 

예를 들어, 클래스 A에 draw() 메서드가 있고, 이를 상속받은 B와 C가 각각 draw()를 오버라이딩했다고 가정해 봅시다. 이때 D라는 클래스가 B와 C를 동시에 상속받는다면, D에서 draw()를 호출할 때 시스템은 B의 것인지 C의 것인지 판단할 근거가 사라집니다. 이러한 모호성은 런타임 오류와 예기치 못한 버그의 주범이 됩니다.


2. 설계의 단순화와 안정성 추구

자바의 핵심 철학 중 하나는 "Simple, Object-Oriented, and Familiar"입니다. 다중 상속은 개발자에게 유연성을 제공하는 것처럼 보이지만, 실제로는 객체 간의 관계를 지나치게 복잡하게 만듭니다. 클래스 계층 구조가 엉키기 시작하면 유지보수 비용이 기하급수적으로 증가하며, 특히 대규모 시스템에서 코드의 흐름을 추적하는 것이 거의 불가능해집니다.

  • 객체 모델의 일관성: 자바는 모든 클래스가 단 하나의 부모(Single Parent)를 갖도록 강제하여 계층 구조를 명확히 유지합니다.
  • JVM 최적화: 단일 상속 구조는 가상 머신(JVM)이 메서드 테이블을 관리하고 호출 대상을 찾는 과정을 훨씬 빠르고 단순하게 만듭니다.

3. 대안으로서의 인터페이스(Interface)

자바는 다중 상속의 '기능'은 필요했지만 '부작용'은 피하고 싶었습니다. 그 해답이 바로 인터페이스(Interface)입니다. 인터페이스는 다중 구현(Multiple Implementation)을 허용함으로써 다중 상속의 이점을 안전하게 제공합니다. 인터페이스는 메서드의 '구현'을 가지지 않고 '명세'만 정의했기 때문에(Java 8 이전 기준), 다이아몬드 문제가 발생하더라도 실제 실행될 코드가 없어 충돌이 일어나지 않았습니다. Java 8 이후 default method가 도입되며 다시 모호성 문제가 제기되었으나, 자바는 "명시적 오버라이딩 강제"라는 규칙을 통해 이를 깔끔하게 해결했습니다.


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

자바의 설계 의도를 명확히 이해하기 위해 각 요소의 특징을 비교해 보았습니다.

구분 클래스 다중 상속 인터페이스 다중 구현 추상 클래스 상속
지원 여부 불가 (Single Inheritance) 가능 (Multiple Implementation) 불가 (단일 상속만 가능)
주요 목적 상태와 행위의 완전한 확장 행위의 규격(Spec) 준수 공통 기능의 확장 및 미완성 설계
모호성 위험 매우 높음 (다이아몬드 문제) 낮음 (구현 강제 또는 명시적 선택) 없음 (단일 계층)
관계 정의 Is-A 관계 (본질적 동질성) Can-Do 관계 (기능적 능력) Is-A-Kind-Of (부분적 완성)

5. 결론: "제약이 곧 자유다"

자바가 다중 상속을 금지한 것은 언어의 한계가 아니라, 엔지니어링 차원의 결단입니다. 복잡한 다중 상속 대신 인터페이스와 구성(Composition)을 활용하도록 유도함으로써, 자바는 더 읽기 쉽고, 테스트하기 쉬우며, 견고한 소프트웨어를 만들 수 있는 환경을 구축했습니다. 만약 여러분이 특정 클래스에서 여러 기능을 가져오고 싶다면, 상속(Inheritance)보다는 객체 주입(Composition)이나 인터페이스를 먼저 고려해 보시기 바랍니다. 그것이 바로 자바가 지향하는 객체지향의 정석입니다.


참고 문헌 및 출처:
1. James Gosling, "The Java Language Specification", Addison-Wesley.
2. Joshua Bloch, "Effective Java 3rd Edition", Pearson Education.
3. Oracle Java Documentation: "Inheritance in Java".

728x90