2023.09.27 WED
574p ~ 587p
45일차 내용 ⬇️
2023.09.26 - [개발 서적 기록/오브젝트_조영호] - 45일차 - LSP와 계약에 의한 설계 : 가변성 규칙
45일차 - LSP와 계약에 의한 설계 : 가변성 규칙
2023.09.26 TUE 558p ~ 573p 44일차 내용 ⬇️ 2023.09.26 - [개발 서적 기록/오브젝트_조영호] - 44일차 - LSP와 계약에 의한 설계 : 계약 규칙 44일차 - LSP와 계약에 의한 설계 : 계약 규칙 2023.09.26 TUE 547p ~ 557p 43
magenta-ming.tistory.com
타입 계층 구현
34일차 기록에서 타입 계층 구현에 대해 다뤘었다.
2023.09.15 - [개발 서적 기록/오브젝트_조영호] - 34일차 - 상속의 주 용도인 타입 계층 구현
34일차 - 상속의 주 용도인 타입 계층 구현
2023.09.15 FRI 436p ~ 446p 33일차 내용 ⬇️ 2023.09.15 - [개발 서적 기록/오브젝트_조영호] - 33일차 - 포워딩과 위임 그리고 자바스크립트의 상속 33일차 - 포워딩과 위임 그리고 자바스크립트의 상속 2023.
magenta-ming.tistory.com
타입 계층을 구현할 때는 객체의 행동을 기반으로 타입 계층을 구성해야한다.
동일한 메시지에 대해 서로 다르게 행동할 수 있는 다형적인 객체를 구현하기 위해서다.
이러한 타입 계층을 구현하려면 클래스 / 인터페이스 / 추상 클래스 / 덕 타이핑 을 이용할 수 있다.
클래스를 이용한 타입 계층 구현
클래스를 이용할 수 있는 이유는, 클래스가 곧 사용자 정의 타입 user-defined data type이기 때문이다.
타입은 객체의 퍼블릭 인터페이스를 가르키므로, 결과적으로 클래스는 객체의 타입과 구현을 말한다.
클래스를 이용하는 방법은 상속을 이용하는 방법을 말한다.
상속을 통해서 자식 클래스가 부모 클래스의 구현과 퍼블릭 인터페이스를 물려받을 수 있다.
타입 계층을 구현을 위해서는 퍼블릭 인터페이스는 유지하지만 구현을 바꿀 수 있어야하는데, 상속을 통해서 실현할 수 있다.
하지만, 상속을 통해서 타입 계층을 구현하면 결합도가 높아진다.
자식 클래스를 부모 클래스의 구현에 강하게 결합시키므로, 구체 클래스를 상속받기 보다 추상 클래스나 인터페이스를 구현하는 것이 좋다.
인터페이스를 이용한 타입 계층 구현
인터페이스를 이용하면, 상속으로 인한 결합도 문제를 피하고, 클래스에서는 안되는 다중 상속의 제약도 해결할 수 있다.
그래서 인터페이스를 이용해서 타입을 정의하고, 클래스를 이용해서 객체를 구현하면 이런 제약 없이 타입 계층을 구현할 수 있다.
여러 클래스가 동일한 타입을 구현하고 있어, 하나의 타입을 구현한 것이 되고, 따라서 동일한 메시지에 응답할 수 있다.
또, 하나의 클래스가 여러 타입을 구현하게 된다.
추상클래스를 이용한 타입 계층 구현
추상 클래스를 이용하면, 상속을 쓰면서도 결합도 이슈를 피할 수 있다.
첫 번째, 추상 클래스를 이용하면 의존하는 대상의 추상화 정도가 다르다.
추상 클래스를 구현한 자식 클래스가, 내부 구현이 아닌 추상 메서드의 시그니처에만 의존하게 되므로, 자식 클래스는 오버라이딩한 하면 된다는 사실에만 의존한다.
이런 점은 구체적인 메서드가 추상적인 메서드에 의존하기 때문에, DIP 의존성 역전 법칙를 준수하게되고, 변경에 유연한 설계가 된다.
두 번째, 추상 클래스를 이용하면 상속을 사용하는 목적이 다르다.
클래스를 이용한 상속은 코드를 재사용하기 위함이지만, 추상 클래스를 이용한 상속은 자식 클래스를 추가하기 위함이므로, 상속 계층을 쉽게 확장할 수 있게하고 결합도에 대한 부작용을 방지할 수 있다.
추상 클래스와 인터페이스 함께 쓰기 : 골격 구현 추상 클래스 skeletal implementation abstract class
인터페이스만 사용하면 중복 코드를 제거하기 어려우므로,
인터페이스를 이용해서 타입을 정의하고,
특정 상속 계층에게 구현된 코드를 공유해야할 때 추상 클래스를 사용해서 코드를 재사용하게 만드는 방법을 사용할 수 있다.
이런 방식이 골격 구현 추상 클래스 skeletal implementation abstract class 다.
이 방법은 2가지 장점이 있다.
- 구현 방법이 다양해졌을 때 대응하기 쉽다 : 새로운 추상 클래스를 추가하면 된다.
- 새로운 타입으로 쉽게 확장할 수 있다 : 인터페이스를 추가하면 된다.