[자바] 인터페이스는 다중 상속이 되는 이유
자바는 클래스의 경우 다중상속이 되지 않습니다. 하지만 인터페이스의 경우 인터페이스 간의 다중상속이 가능합니다. 분명히 상속 관련 글을 썼을 때 다중상속이 안되는 이유를 간단히 설명했습니다. 그런데 인터페이스는 그걸 무시하고 상속이 된다니, '인터페이스끼리는 어떤 이유로 다중상속이 가능한 것인가?'에 대해 알아보겠습니다.
클래스, 왜 다중상속이 안되는 것인가?
우선 클래스가 다중상속이 안되는 이유에 대한 그림입니다. Female, Male클래스가 Human이라는 같은 클래스를 상속받고 Person이라는 클래스가 Female, Male 클래스를 상속받습니다. (생각해보니 저 Person은 인간이 아니네요.)
이렇게 상속받게 되면 중요한 문제가 발생합니다.
'Person이 옷을 입으려 할 때 Person은 Female처럼 입어야할까? Male처럼 입어야할까?'
설명은 비록 '어떤 성별의 옷을 입어야 할까'같은 질문처럼 했지만 이를 각 클래스의 메소드로 생각해보면 Female클래스는 치마와 바지를 입을 수 있지만 Male클래스는 바지 밖에 못 입죠. 만약에 Person의 슈퍼클래스의 getCloth()메소드를 써야하고 해당 메소드를 슈퍼클래스 Female과 Male이 둘 다 갖고 있다면 소스코드에서는 어떤 슈퍼클래스의 getCloth()를 써야하는지 알 수 없게 됩니다.
이는 비단 '슈퍼클래스의 메소드 사용'에만 문제가 발생하는 것이 아닙니다. 메소드 오버라이딩을 할 때 어떤 슈퍼클래스의 메소드를 오버라이딩 하려고 하는지 자바는 알 수 없습니다. 이런 문제 때문에 클래스는 다중상속을 할 수 없습니다.
왜 인터페이스끼리는 다중상속이 되는가?
그렇다면 클래스의 다중상속에서 발생한 문제를 어떻게 인터페이스는 피했을까요?
이는 인터페이스가 어떤 모양을 가졌는지 생각하면 쉽게 이해할 수 있습니다.
인터페이스는 일반 클래스처럼 메소드가 어떤 행동을 하는지는 기술하지 않습니다. 추상화된 메소드이기 때문이죠.
이 말은 Female과 Male의 getcloth()가 누구 것인가는 신경쓸 필요없이 Person에서 abstract된 getcloth()만 있으면 문제없이 다중상속을 받을 수 있는 것입니다. (이 때 다중상속은 인터페이스와 인터페이스 사이에서만 가능합니다.)
'자바 > 자바 - 짧게 쓰는 글' 카테고리의 다른 글
톰캣이 정상적으로 실행되지 않을 때(Tomcat failed to start) (0) | 2017.07.10 |
---|---|
String <-> byte[] 변환 방법 (0) | 2017.07.09 |
왜 저장이 안될까? close()는 매우 중요합니다! (0) | 2017.03.28 |
StringBuffer와 StringBuilder의 차이 (0) | 2016.06.26 |
String을 저장하는 두 가지 방법과 String pool (3) | 2016.06.26 |