이전에 나온 타입, 클래스, 상속에 대하여 다시 한번 짚고 넘어가는 파트였습니다.
클래스를 이용한 타입계층의구현
타입을 구현할 수 있는 다양한 방법이 존재하는 손간부터는 클래스와 타입은 갈라지기 시작한다.
...
상속은 자식 클래스를 부모 클래스의 구현에 강하게 결합시키기 때문에 구체 클래스를 상속받는 것은 피해야 한다. 가급적 추상 클래스를 상속받거나 인터페이스를 구현하는 방법을 사용하기 바란다.
타입!=클래스이며 클래스는 타입을 구현하기 위한 방법이라는 것을 다시 한번 마음에 새겨넣었습니다.
인터페이스를 이용한 타입 계층 구현
인터페이스를 이용해 타입을 정의하고 클래스를 이용해 객체를 구현하면 클래스 상속을 사용하지 않고도 타입 계층을 구현할 수 있다는 사실이다.
...
타입은 동일한 퍼블릭 인터페이스를 가진 객체들의 범주다. 클래스는 타입에 속하는 객체들을 구현하기 위한 구현 메커니즘이다.
타입은 동일한 인터페이스를 지닌 것들을 모아놓은 무언가이며 클래스는 이를 구현하기 위한 방법입니다.
추상클래스를 이용한 타입 계층 구현
하나는 추상화의 정도이고 다른 하나는 상속을 사용하는 의도다.
...
첫 번째로 의존하는 대상의 추상화 정도가 다르다.
...
한 가지 조언은 모든 구체 클래스의 부모 클래스를 항상 추상 클래스로 만들기 위해 노력하라는 것이다. 의존하는 대상이 더 추상적일수록 결합도는 낮아지고 결합도가 낮아질수록 변경으로 인한 영향도는 줄어든다.
...
두 번째 차이점은 상속을 사용하는 의도다.
구체 클래스가 의존하는 "클래스"는 어지간하면 추상 클래스로 만들고 상속을 사용하는 의도는 타입간의 계층 구조를 만들기 위함에 있습니다.
추상클래스와 인터페이스 결합하기
이제 상속 계층에 대한 제약을 완화시켜 DiscountPolicy 타입으로 분류될 수 있는 객체들이 구현 시에 서로 다른 상속 계층에 속할수 있도록 만들고 싶다고 가정해보자. 가장 좋은 방법은 인터페이스와 추상 클래스를 결합하는 것이다.
인터페이스로 객체간 동일한 메시지를 수신할 수 있도록 만들고 코드 중복을 막기 위해 추상 클래스를 이용할 수 있습니다.
덕 타이핑 사용하기
덕 타이핑은 타입이 행동에 대한 것이라는 사실을 강조한다. 두 객체가 동일하게 행동한다면 내부 구현이 어떤 방식이든 상관없다. 타입 관점에서 두 객체는 동일한 타입인 것이다.
...
동일한 시그니처를 가진 메서드를 구현하고 있기 때문에 동일한 타입으로 간주할 수 있다.
...
덕 타이핑은 타입이 행동에 대한 것이라는 사실을 강조한다. 두 객체가 동일하게 행동한다면 내부 구현이 어떤 방식이든 상관없다. 타입 관점에서 두 객체는 동일한 타입인 것이다.
...
덕 타이핑을 사용하면 컴파일 시점에 발견할 수 있는 오류를 실행시점으로 미루게 되기 때문에 설계의 유연성을 얻는 대신 코드의 안전성을 약화시킬 수 있다는 점에 주의하라.
덕 타이핑은 자바에서는 지원하지 않는 기능입니다. 그러나 알고 있다면 도움이 되리라 생각하기에 적었습니다. 또한 이를 하나의 문장으로 정리하면 이는 "동일한 시그니처일 경우 동일할게 취급한다."입니다.
믹스인과 타입 계층
스칼라의 트레이트와 유사하게 자바 8에 새롭게 추가된 디폴트 메서드는 인터페이스에 메서드의 기본 구현을 추가하는 것을 혀용한다.
...
디폴트 메서드가 추가된 이유는 기존에 널리 사용되고 있는 인터페이스에 새로운 오퍼레이션을 추가할 경우에 발생하는 하위 호환성 문제를 해결하기 위해서지 추상 클래스를 제거하기 위한 것이 아니다.
...
타입 계층을 구현한다고 하더라도 리스코프 치환 원칙을 준수하지 않는다면 올바른 타입 계층을 구현한 것이 아니다.
디폴트 메서드에 대해 이야기를 하고 있습니다. 저는 이전에는 디폴트 메서드란 인터페이스에 구현을 할 수 있도록 한 것으로 알고 있었습니다. 그러나 책에서는 이를 위해 추가한 것이 아니라고 말을 합니다. 이에 대한 저의 생각은 인터페이스를 기본으로 깔고 가되 만약 추가적인 오퍼레이션이 필요하다면 이를 디폴트 메서드로 미리 구현을 하여 이용하자로 정리할수 있을것 같습니다.
'책 > 오브젝트 (완)' 카테고리의 다른 글
부록A 계약에 의한 설계 (0) | 2024.03.12 |
---|---|
15 디자인 패턴과 프레임워크 (0) | 2024.02.21 |
14 일관성 있는 협력 (0) | 2024.02.20 |
13 서브클래싱과 서브타이핑 (0) | 2024.02.16 |
12 다형성 (1) | 2024.02.11 |