상속을 통한 확장
기존 서비스 도메인에 다양한 확장 기능을 붙이고 싶을 때
몇몇 기능들은 그대로 동일하게 쓰고, 몇몇 기능만 클래스별로 구분하고 싶은 경우가 있을 수 있다.
이러한 경우에 abstract 키워드를 이용한 상속을 사용하면 도움이 될 수 있다.
클래스 별로 구분하고 싶은 기능은 abstract method로 선언만 해두고
구현 클래스에서 해당 abstract class를 extends 하면 된다.
이 또한 오브젝트 책에서 언급된 내용이었다.
상속을 통해 중복 코드를 제거할 수 있지만, 부모가 수정되는 경우 자식에게도 영향을 끼칠 수 있다
(캡슐화를 약화시키고 결합도를 높인다)
(https://kkang-joo.tistory.com/135)
클래스의 분리
상속을 사용하면 겪는 다양한 단점으로, 상속을 이용하지 않고 클래스를 분리한다.
하지만 클래스를 분리해 버리면 호출하려는 객체(callee)가 변경될 때마다 caller의 변경이 불가피하다.
인터페이스 도입
위의 문제를 해결하기 위해서 interface를 선언하고, caller에서 interface를 선언해 사용한다.
객체 생성 부분 이외에는 interface를 사용하므로 영향도가 조금은 낮아진다.
하지만, 객체를 생성하는 시점이 caller에 있다면 callee 변경에 따른 수정은 불가피하다.
관계설정 책임의 분리
위의 문제를 해결하기 위해 caller에서 callee를 생성하는 게 아니고 외부에서 생성한 객체를 가져다 쓴다.
가져다 쓰는 부분은 interface만 사용하면 되니, callee 수정에 대한 영향이 드디어 사라진다.
오브젝트 팩토리
관계 설정 책임의 분리를 외부 한 단계 위로 올리는 것 말고
오브젝트 팩토리를 따로 두어서 - 관계 설정의 책임을 전적으로 담당하게 한다.