자바에서 다중상속은 불가능하다.
가정 - 다중 상속이 가능하다면
class mom {
public void say() {
System.out.println("hello");
}
}
class dad {
public void say() {
System.out.println("hi");
}
}
class child extends mom, dad {
}
아래의 코드를 실행하면 c.say()는 무엇을 출력해야할까?
child c = new child();
c.say();
hi? hello? 이렇듯 어떤 say를 상속받아와야하는지 문제가 생길 수 있다.
인터페이스를 사용하면 다중상속의 문제를 해결할 수 있다.
class mom {
public void say() {
System.out.println("hello");
}
}
interface dad {
void say();
}
class child extends mom implements dad {
}
이런 식으로 바꿀 수 있다.
하지만 dad가 class에서 interface로 바뀌며 변화된 부분이 있다.
인터페이스는 모든 메서드가 추상메서드여야한다.
그렇기 때문에
public abstract void say();
지만 인터페이스는 무조건 모든 메서드가 추상메서드이기 때문에 public abstract를 생략할 수 있다.
인터페이스는 추상 메서드로만 구성되기 때문에 다중 상속을 해도 겹치는 메서드여도 무조건 오버라이딩해야하기 때문에 문제가 없다.