상속은 is a 관계를 만족해야 한다는 말에 주어와 보어로 상위 클래스와 하위 클래스를 넣어보자. 상속관계를 만족하는 문장은 "하위 클래스는 상위 클래스"라고 했다. 즉, 주어는 하위 클래스이고 보어는 상위 클래스이다. 즉 is a 관계로 표현하면 다음이 만족되어야 한다.
하위 클래스 is a 상위 클래스
클래스는 분류인데 객체 앞에 붙이는 a를 쓸 수 있을까? 상위 클래스는 하나의 객체가 아니다. 즉 상속 관계의 더 명확한 표현은 바로 is a kind of
관계다.
하위 클래스 is a kind of 상위 클래스
왜 자바는 다중 상속을 지원하지 않을까?
사람도 수영할 수 있고, 물고기도 수영할 수 있는데 인어에게 수영하라고 하면 사람처럼 팔과 다리를 저어 수영해야 하는지 물고기처럼 지느러미로 헤엄쳐야 하는지 모호해지는 것이다. 이와 같은 문제를 다중 상속의 다이아몬드 문제
라고 한다. 결국 C#과 자바에서는 다중 상속을 포기했다. 대신 자바에서는 C++에 없는 인터페이스
를 도입해 다중 상속의 득은 취하고 실은 과감히 버렸다.
상속 관계는 is a kind of 관계이다. 그럼 다중 상속을 포기하고 대신 인터페이스를 도입한 자바에서 인터페이스는 어떤 관계를 나타내는 것일까? 인터페이스는 상속과 다르게 쓰는 것이 유용하다.
인터페이스 : 구현 클래스 is able to 인터페이스
이를 이전에 본 상속도(분류도)에 적용해보자.
자바에서는 다음과 같은 인터페이스가 있는 것을 볼 수 있다.
상위 클래스는 하위 클래스에게 특성(속성과 메서드)
를 상속
해주고, 인터페이스는 클래스가 '무엇을 할 수 있다'라고 하는 기능
을 구현
하도록 강제하게 된다.
그렇다면
상위 클래스는 물려줄 특성이 풍성할 수록 좋고, 인터페이스는 구현을 강제할 메서드의 개수가 적을 수록 좋다. 상위 클래스가 풍성할 수록 좋은 이유는 LSP(리스코프 치환 원칙)에 따른 이유라고 볼 수 있고, 인터페이스가 적을 수록 좋은 이유는 ISP(인터페이스 분할 원칙)에 따른 이유라고 할 수 있다.
참고