상속이 아닌 인터페이스를 생각해라. (ologist's blog2.0) 글을 보고 드는 생각을 적어봅니다.

상속을 사용하든 인터페이스를 구현하든 결국 다형성이라는 장점을 사용할 수 있습니다. 상속이 유용할 때도 있고 구현이 유용할 때도 있겠지만 위의 글에 나온 예제에서처럼 클래스의 "책임"만을 강제 하기 위한 수단으로는 단연 인터페이스가 유용하다고 생각합니다.

윗 글의 코드를 다이어그램으로 그리면 다음과 같습니다.

1015689612.bmp(A) 인터페이스를 이용한 다형성

하지만 상속을 사용해서도 어느정도 "책임"을 강제 할 수 있습니다. Abstract 클래스를 사용하여 자식 클래스에서 꼭 구현하도록 하는것이죠. 위 글의 그림을 아래와 같이 그릴 수 있겠습니다.

1287918946.bmp(B) 상속을 이용한 다형성

위와 아래 둘 다 상위 타입의 객체를 못만듭니다. 그리고 자신이 가지고 있는 책임을 하위 클래스에서 구현하도록 강제하고 있습니다. 클라이언트 클래스 입장에서는 그 것이 Abstract 클래스든 인터페이스든 결국 똑같습니다. 하지만 차이가 있다면 Abstract 클래스의 경우에는 필드들 까지 재사용하게 할 수 있다는 겁니다. 따라서 다음과 상위 타입이 필드를 가지고 있을 수 있습니다.
1234202692.bmp
인터페이스 안에 있는 필드는 default가 public staic final이고 private이나 protected로 선언할 수 없으며 final이라는 키워드를 쓰지 않아도 final로 인식하기 때문에 하위에서 재정의 할 수가 없습니다.

아무래도 때에 따라 사용하는 경우가 다르겠지만 상속을 이용하는 장점이라고 한다면 이렇게 필드를 재사용할 수 있다는 것과 다형성인듯 합니다.