Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

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

by Greedy 2024. 5. 24.

Java가 다중 상속을 지원하지 않는 이유는 주로 다이아몬드 문제(Diamond Problem)와 관련된 복잡성과 모호성을 피하기 위해서이다

다중 상속은 하나의 클래스가 둘 이상의 부모 클래스로부터 상속받는 것을 의미한다

주요 이유와 그에 따른 문제점은 다음과 같다

1. 다이아몬드 문제 (Diamond Problem)

다이아몬드 문제는 다중 상속을 사용하는 언어에서 자주 발생하는 문제로, 두 개의 클래스가 동일한 부모 클래스를 상속받고, 그 두 클래스를 또 다른 클래스가 상속받을 때 발생한다

이러한 상속 구조는 아래와 같이 다이아몬드 모양을 형성한다

   A
  / \\
 B   C
  \\ /
   D

위와 같은 구조에서 D 클래스가 A 클래스의 메서드를 상속받을 때, **B**와 C 클래스가 A 클래스의 동일한 메서드를 상속받고 변경했을 경우, D 클래스는 어느 클래스의 메서드를 상속받아야 할지 모호해진다

이로 인해 코드의 복잡성과 예측 불가능성이 증가한다

2. 유지보수의 어려움

다중 상속을 사용하면 다음과 같은 유지보수 문제를 야기할 수 있다

복잡한 상속 계층 구조: 다중 상속은 상속 계층 구조를 복잡하게 만들어 코드를 이해하고 유지보수하기 어렵게 만든다

충돌 가능성: 여러 부모 클래스에서 동일한 이름의 메서드나 필드가 정의될 경우, 자식 클래스에서 이를 관리하기 어려워지고, 충돌을 해결하기 위한 추가적인 코딩이 필요하게 된다

3. 인터페이스를 통한 다형성 지원

Java는 다중 상속 대신 인터페이스를 사용하여 다형성을 지원한다

인터페이스는 클래스가 구현해야 하는 메서드를 정의하며, 다중 인터페이스를 구현할 수 있도록 허용하여 다중 상속의 이점을 제공한다

코드의 복잡성을 줄이고 명확성을 높일 수 있다

interface A {
    void methodA();
}

interface B {
    void methodB();
}

class C implements A, B {
    public void methodA() {
        System.out.println("Method A");
    }

    public void methodB() {
        System.out.println("Method B");
    }
}

4. 설계 철학

Java는 단순성과 명확성을 강조하는 설계 철학을 가지고 있다

다중 상속을 지원하지 않음으로써, Java는 언어의 복잡성을 줄이고, 개발자가 더 직관적이고 유지보수하기 쉬운 코드를 작성할 수 있도록 한다

단일 상속 모델을 통해 클래스 간의 관계를 더 명확하게 하고, 다중 상속으로 인해 발생할 수 있는 문제를 사전에 방지한다

결론

Java가 다중 상속을 지원하지 않는 주요 이유는 다이아몬드 문제와 같은 복잡성과 모호성을 피하기 위해서이다

대신 Java는 인터페이스를 통해 다형성을 지원하여, 다중 상속의 이점을 제공하면서도 복잡성을 줄이고 유지보수성을 높이고자 한다

Java는 명확하고 직관적인 코드 작성을 장려하며, 개발자가 더 쉽게 코드를 이해하고 관리할 수 있도록 돕는다