객체지향의 4대 특성(2) : 상속(2)

3. 상속은 is a 관계를 만족해야 한다?

상속은 is a 관계를 만족해야 한다는 말에 주어와 보어로 상위 클래스와 하위 클래스를 넣어보자. 상속관계를 만족하는 문장은 "하위 클래스는 상위 클래스"라고 했다. 즉, 주어는 하위 클래스이고 보어는 상위 클래스이다. 즉 is a 관계로 표현하면 다음이 만족되어야 한다.

하위 클래스 is a 상위 클래스

클래스는 분류인데 객체 앞에 붙이는 a를 쓸 수 있을까? 상위 클래스는 하나의 객체가 아니다. 즉 상속 관계의 더 명확한 표현은 바로 is a kind of 관계다.

하위 클래스 is a kind of 상위 클래스

4. 다중 상속과 자바

왜 자바는 다중 상속을 지원하지 않을까?

사람도 수영할 수 있고, 물고기도 수영할 수 있는데 인어에게 수영하라고 하면 사람처럼 팔과 다리를 저어 수영해야 하는지 물고기처럼 지느러미로 헤엄쳐야 하는지 모호해지는 것이다. 이와 같은 문제를 다중 상속의 다이아몬드 문제라고 한다. 결국 C#과 자바에서는 다중 상속을 포기했다. 대신 자바에서는 C++에 없는 인터페이스를 도입해 다중 상속의 득은 취하고 실은 과감히 버렸다.

5. 상속과 인터페이스

상속 관계는 is a kind of 관계이다. 그럼 다중 상속을 포기하고 대신 인터페이스를 도입한 자바에서 인터페이스는 어떤 관계를 나타내는 것일까? 인터페이스는 상속과 다르게 쓰는 것이 유용하다.

인터페이스 : 구현 클래스 is able to 인터페이스

이를 이전에 본 상속도(분류도)에 적용해보자.

자바에서는 다음과 같은 인터페이스가 있는 것을 볼 수 있다.

  • Serializable 인터페이스 : 직렬화할 수 있는
  • Cloneable 인터페이스 : 복제할 수 있는
  • Comparable 인터페이스 : 비교할 수 있는
  • Runnable 인터페이스 : 실행할 수 있는

상위 클래스는 하위 클래스에게 특성(속성과 메서드)상속해주고, 인터페이스는 클래스가 '무엇을 할 수 있다'라고 하는 기능구현하도록 강제하게 된다.

그렇다면

  • 상위 클래스는 하위 클래스에게 물려줄 특성이 많을수록 좋을까? 적을수록 좋을까?
  • 인터페이스는 구현을 강제할 메서드가 많을수록 좋을까? 적을수록 좋을까?

상위 클래스는 물려줄 특성이 풍성할 수록 좋고, 인터페이스는 구현을 강제할 메서드의 개수가 적을 수록 좋다. 상위 클래스가 풍성할 수록 좋은 이유는 LSP(리스코프 치환 원칙)에 따른 이유라고 볼 수 있고, 인터페이스가 적을 수록 좋은 이유는 ISP(인터페이스 분할 원칙)에 따른 이유라고 할 수 있다.

참고

  • 스프링 입문을 위한 자바 객체지향의 원리와 이해

좋은 웹페이지 즐겨찾기