Java의 다중 상속 문제와 인터페이스

LSM ·2022년 3월 2일
0

1. 작성 배경

자바를 공부하셨거나 공부하시고 있는 사람들은 자바에서 다중 상속이 불가능하다는 것을 알고 있을 거라 생각한다! 나 역시 작년 자바를 처음 배우면서, 다중 상속이 불가능한 언어라는 것임을 알게되었다. 그리고 그 이유가 초기 자바 개발시 언어의 목적이 이 모호함이 없는 안전한 언어를 개발하기 위함에 있다고 들었다. 사실 책으로 듣거나 말로 듣게 되면 "음~ 그래??" 하고 넘어갈수 있는 부분이라고 여길 수 있다. 나 역시 마찬가지이다 ㅎㅎㅎ..

최근 자바 공부를 다시 하면서 이 전에 그냥 듣고만 넘어갔던 부분을 좀 더 자세하게 그 원리를 알기 위해 정리하고 있다.

이번 글 역시 마찬가지이다.

이 글을 통해 다중 상속의 불허와 인터페이스의 다중 구현이 가능한 이유를 짚어보는 시간을 가지도록 하겠다!!


2. 다중 상속

자 다중 상속의 상황을 코드를 통해서 예시를 들어보겠다.

예시 코드

Person

public class Person {

   String species = "영장류";

   protected void 국적(){
      System.out.println("국적을 오버라이딩 하세요");
   }
}

Person 객체를 상속 받은 Father

public class Father extends Person {
   @Override
   protected void 국적() {
      System.out.println("대한민국");
   }
}

Person 객체를 상속 받은 Mother

public class Mother extends Person {
   @Override
   protected void 국적() {
      System.out.println("미국");
   }
}

Mother 객체를 상속 받은 Child

public class Child extends Mother {
   public static void main(String[] args) {
      Child child = new Child();
      System.out.println("나의 생물학적 분류는 "+child.species+"입니다.");
      child.국적();
   }
}

자!!

Child 객체에서 선언된 메인 메서드의 결과는 무엇이 나올까?!

간단하다.

"나의 생물학적 분류는 영장류입니다." , "미국"

위와 같은 결과를 볼 수 있을 것이다.

그렇다면 만약 다중 상속이 허용된다면?? 엄마와 아빠의 객체를 둘다 상속 받는다고 가정하자!

child.국적();은 어떤 결과를 낼 수 있을까?

굉장히 모호해 지는 걸 알 수 있다.

이러한 현상을 "다이아몬드 문제" 라한다.

즉 Person의 국적을을 아빠와 엄마 모두 오버라이딩 했다면 자식은 어떤 국적 메소드를 받아 올 지 알 수 없다는 것이다!

실제로 이 애플리케이션을 실행해야하는 JVM에서는 Father에도 선언되어 있고, Mother에도 선언되어 있는 가문()중 어떤걸 Child가 상속받아야하는지를 모르기 때문에 컴파일 에러가 발생한다.


3. 그렇다면 인터페이스 다중 구현은??

예시 코드

Person

public interface Person {

   String species = "영장류";

   public abstract void 국적(){};
}

Person 인터페이스를 상속 받은 Father

public interface Father extends Person {
   @Override
   public abstract void 국적(){};
}

Person 인터페이스를 상속 받은 Mother

public interface Mother extends Person {
   @Override
   public abstract void 국적(){};
}

Mother,Father 인터페이스를 구현하는 구현체 Child

public class Child implements Mother,Father {

	@Override
   void 국적(){
      System.out.println("대한민국");
   }
   public static void main(String[] args) {
      Child child = new Child();
      System.out.println("나의 생물학적 분류는 "+child.species+"입니다.");
      child.국적();
   }
}

자 위 코드를 보면 왜 인터페이스의 다중 구현이 가능한가 알 수 있다.

어차피 인터페이스에는 추상 메서드로 구성되어 중간 과정에 구현체가 없기 때문에,

Child가 오버라이딩 해야하는 즉 구현해야하는 메소드가 Father로부터 받은건지, Mother로부터 받은건지 알필요가 없다는 것이다.


4. 참고 자료

https://youngjinmo.github.io/2021/03/diamond-problem/

profile
개발 및 취준 일지

0개의 댓글