출처: https://incheol-jung.gitbook.io/docs/study/object/2020-03-10-object-chap13
Subclassing=한 클래스의 상태와 행위를 재사용하는 것(=상속하는 것, 즉 상태와 구현한 행위들을 통째로 재사용하는 것을 말함).
Subtyping (=구체화 관계)= (인터페이스의) 외부모습만 재사용 한것(=인터페이스를 구현하는 것). (한 클래스가 인터페이스를 구현하는 것)
중요한 것은 Subtyping이 반드시 인터페이스를 구현하는 것은 아니라는 것이다. 인터페이스를 구현하는 것은 자바에서의 Subtyping의 개념인것이지 언어를 초월한 개념적인 면에서 Subtyping은 외부모습만 재사용 하는 것이다!
그리고 재미있게도 상속이라는 개념은 Subclassing도 맞고 Subtyping도 맞다. 어떻게 상속이 Subtyping인가?
아래 코드에서 장식자(CondimentDecorator)는 상속을 하지만(Beverage를 상속), 상속의 목적이 subClassing에 있지 않음. getDescription을 추상메서드로 만들기 위함. 즉 외부모습만 재사용하기 위함. 따라서 상속을 통해 외부모습만 재사용하는 subtyping인 것이다.
앞서 클래스 간 관계를 상속과 구체화로 구분하였지만 이 구분은 자바에 적용되는 개념이고, 실제 객체지향에서는 클래스 간 관계를 subclassing과 subtyping으로 구분한다.
Subclassing
한 클래스의 상태와 행위의 구현을 재사용하는 것
Subtyping
외부 모습만 재사용하는 것을 말한다
특히, B가 A의 subtype이면(=B가 A의 모습만을 재사용한것. 즉 B는 A의 인터페이스일 가능성이 높음) A 타입을 기대하는 어느 곳이나 B 타입의 객체(=인터페이스 B를 구현한 클래스의 객체)를 안전하게 사용할 수 있어야 한다. 이것을 대체가능성(substitutability)이라 한다.
Subclassing을 하면 subtyping의 효과를 얻을 수 있지만(당연한말. 상속을 하면 외부모습만 재사용할 수 있는 효과가 있음) 언어마다 subclassing과 subtyping을 제공하는 방법에 따라 subclassing을 하면서 subtyping을 얻을 수 없는 경우도 많다. 특히 subclassing을 하였지만 논리적으로 subtyping이 성립하지 않는 경우가 많다. 자바의 상속은 명백하게 subclassing이며, 구체화(인터페이스를 구현하는 것. 즉 인터페이스의 외부 모습만 재사용하여 인터페이스를 구현하는 것이므로 구체화는 subtyping에 해당하는 것임)는 subtyping에 해당한다. 또 자바에서 상속을 하면 물리적 subtyping도 제공된다(자바에서는 subclassing, 즉 상속하면 물리적으로 subtyping의 효과도 있음). 즉, B 클래스가 A 클래스의 자식 클래스이면 B 클래스 객체를 A 클래스의 객체를 요구하는 위치에 언제든지 문법적 오류 없이 사용할 수 있다. 하지만 앞서 언급한 바와 같이 논리적으로는 그렇게 사용하는 것이 적절하지 않을 수 있다.
아래글을 보고 처음에는 무척 혼동스러웠다. 해설은 아래와 같다.
(출처: https://velog.io/@yhlee9753/Java-%EC%9D%98-Generics)
서브클래싱은 바로 이해가 가므로 넘어가고 서브타이핑이 문제였다. 위와같이 서브타이핑을 정의하면 논리이 있지만 그래도 꾸역꾸역 맞는 말이 될수 있다. 하지만 내가 가지고 있어야 하는 서브타이핑의 정의는 "외부 모습만 재사용하는 것"으로 변하지 않는다. 타입계층을 구성하기 위해 상속을 사용한다는 말은 기본적으로 위에서 예로 들었던 장식자를 보면 바로 이해할 수 있다. 상속을 하는 동시에 추상메서드를 만듬으로써 동시에 타입 계층을 구성하게 된 것이다. 그렇다면 외부 모습만 재사용하여 인터페이스를 구현하는 클래스는 어떻게 설명되는가? 인터페이스를 구현한다는 것이 때로는 상속으로 표현되기도 한다! 그냥 표현의 문제임.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
13장 서브클래싱과 서브타이핑
'자바 언어 & 객체지향 지식' 카테고리의 다른 글
공변성, 반공변성, 무공변성에 대하여 (0) | 2023.10.13 |
---|---|
자바 Reflection(리플랙션)에 대해서 (0) | 2023.10.09 |
자바 익숙히 할 표현법들(스트림 라이브러리, 그래프표현법 등등) (0) | 2023.09.26 |
자바 스트림 라이브러리에 대하여 (0) | 2023.09.14 |
왜 Scanner가 아닌 BufferedReader인가! (0) | 2023.09.14 |