자바를 공부하셨거나 공부하시고 있는 사람들은 자바에서 다중 상속이 불가능하다는 것을 알고 있을 거라 생각한다! 나 역시 작년 자바를 처음 배우면서, 다중 상속이 불가능한 언어라는 것임을 알게되었다. 그리고 그 이유가 초기 자바 개발시 언어의 목적이 이 모호함이 없는 안전한 언어를 개발하기 위함에 있다고 들었다. 사실 책으로 듣거나 말로 듣게 되면 "음~ 그래??" 하고 넘어갈수 있는 부분이라고 여길 수 있다. 나 역시 마찬가지이다 ㅎㅎㅎ..
최근 자바 공부를 다시 하면서 이 전에 그냥 듣고만 넘어갔던 부분을 좀 더 자세하게 그 원리를 알기 위해 정리하고 있다.
이번 글 역시 마찬가지이다.
이 글을 통해 다중 상속의 불허와 인터페이스의 다중 구현이 가능한 이유를 짚어보는 시간을 가지도록 하겠다!!
자 다중 상속의 상황을 코드를 통해서 예시를 들어보겠다.
public class Person {
String species = "영장류";
protected void 국적(){
System.out.println("국적을 오버라이딩 하세요");
}
}
public class Father extends Person {
@Override
protected void 국적() {
System.out.println("대한민국");
}
}
public class Mother extends Person {
@Override
protected void 국적() {
System.out.println("미국");
}
}
public class Child extends Mother {
public static void main(String[] args) {
Child child = new Child();
System.out.println("나의 생물학적 분류는 "+child.species+"입니다.");
child.국적();
}
}
자!!
Child 객체에서 선언된 메인 메서드의 결과는 무엇이 나올까?!
간단하다.
"나의 생물학적 분류는 영장류입니다." , "미국"
위와 같은 결과를 볼 수 있을 것이다.
그렇다면 만약 다중 상속이 허용된다면?? 엄마와 아빠의 객체를 둘다 상속 받는다고 가정하자!
child.국적();은 어떤 결과를 낼 수 있을까?
굉장히 모호해 지는 걸 알 수 있다.
즉 Person의 국적을을 아빠와 엄마 모두 오버라이딩 했다면 자식은 어떤 국적 메소드를 받아 올 지 알 수 없다는 것이다!
public interface Person {
String species = "영장류";
public abstract void 국적(){};
}
public interface Father extends Person {
@Override
public abstract void 국적(){};
}
public interface Mother extends Person {
@Override
public abstract void 국적(){};
}
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로부터 받은건지 알필요가 없다는 것이다.