TIL/JAVA

[TIL] 인터페이스 - 다중 상속 (JAVA)

Dream COM Ddulut 2024. 10. 30. 22:25

드디어 다형성 부분을 끝냈다. 추상 클래스, 순수 추상 클래스, 인터페이스 등 여러 흥미로운 내용을 학습했다. 

오늘은 그중에서도 가장 인상 깊었던 '다중 상속'에 대해 정리해보겠다.

 

JAVA의 상속을 공부할 때 'JAVA는 다중 상속을 지원하지 않는다.' 라고 배웠었다.

그런데 이제 와서 다중 상속(구현)이 된다니 이게 무슨 소린가 싶었다. 🫠(정말 흥미로워..)

차근차근 알아보도록 하자.


1. 다이아몬드 문제

자바에서 `extends` 대상은 단 하나로 제한된다. 즉, 자식은 하나의 부모만 선택할 수 있다.
아래 그림과 같은 경우는 금지된다.

[그림] Child 클래스가 2개의 부모를 다중 상속함


위 그림과 같이 Child가 다중 상속을 사용한다고하자. 또한 부모 클래스 모두 순수 추상 클래스가 아니라고 가정한다.

Child는 부모로부터 sing()이라는 기능을 호출하고싶다. 하지만 Parent1과 Parent2 모두 Sing()이라는 기능을 가지기 때문에 Child는 어떤 부모로부터 해당 기능을 호출해야하는지 애매한 상태가 된다. 

이를 '다이아몬드 문제'라고 하며, 자바에서 다중 상속을 지원하지 않는 주된 이유다.

 

2. '인터페이스'와 '다중 상속(구현)'

하지만 인터페이스는 다중 상속(다중 구현)을 지원한다.

인터페이스는 순수 추상 클래스와 동일한 특징을 가지고 있다. 즉, 인터페이스의 모든 메서드가 추상 메서드이다. 따라서 인터페이스를 상속(정확히는 '구현')하는 자식 클래스는 인터페이스의 모든 메서드를 오버라이딩 해야한다.

[그림] 인터페이스의 다중 구현

 

위 그림에서 Interface1과 Interface2는 모두 Sing()이라는 기능을 가지지만, 모두 추상 메서드이기 때문에 해당 기능은 Child가 오버라이딩하여 구현해야한다. 이때 오버라이딩 된 메서드가 항상 우선권을 가진다는 규칙에 따라 Child가 구현한 Sing()이 사용된다. 즉, 두 인터페이스의 Sing() 중 어느 하나를 택하더라도 결과적으로 오버라이딩 된 Sing()을 찾아가기 때문에 다이아몬드 문제가 발생하지 않는다는 것이다. 따라서 인터페이스는 다중 구현을 허용한다.