객체들은 서로 필요로 하기 때문에 결합됩니다
애플리케이션이 성장하기 시작하고 객체 수가 수십 개가 넘어가면서부터 객체 사이의 강한 결합도가 심각한 문제가 됩니다
결합도 문제는 유지보수성에 큰 영향을 미칩니다
애플리케이션 전체를 유지보수 가능하도록 만들기 위해서는 최선을 다해서 객체를 분리해야합니다
객체 분리란 상호작용하는 다른 객체를 수정하지 않고도 해당 객체를 수정할 수 있도록 만든다는 것을 의미합니다
바로 인터페이스를 이용하는 것입니다
interface Cash {
Cash multiply(float factor);
}
Cash는 인터페이스 입니다
우리의 객체가 다른 객체와 소통하기 위해 따라야하는 계약입니다
class DefaultCash implements Cash {
private int dollars;
DefaultCash(int dlr) {
this.dollars = dlr;
}
@Override
Cash multiply(float factor) {
return new DefaultCash(this.dollars * factor);
}
}
금액이 필요하다면 실제 구현 대신 계약에 의존하면 됩니다
class Employee {
private Cash salary;
}
Employee 클래스는 Cash 인터페이스의 구현 방법에 아무런 관심이 없습니다
multiply() 메서가 어떻게 동작하는지도 관심이 없습니다
즉, Cash 동작 방식을 알지 못합니다
Employee 클래스와 DefaultCash 클래스를 느슨하게 분리할 수 있습니다
DefaultCash 내부 구현을 변경하거나 Cash 인터페이스 구현체를 교체하더라도 Employee에는 아무런 영향이 없습니다
추가로 클래스 안의 모든 퍼블릭 메서드가 인터페이스를 구현하도록 만들어야 합니다
올바르게 설계된 클래스라면 최소한 하나의 인터페이스라도 구현하지 않은 퍼블릭 메서드가 포함해서는 안됩니다
동일한 인터페이스를 구현하는 여러 클래스들이 존재합니다
그리고 서로 쉽게 대체될 수 있어야 합니다
클래스는 서로 느슨한 결합도를 가지고 있어야 합니다
이 글은 학습을 위해 “엘레강트 오브젝트" 책 내용을 정리한 글입니다.
저작권 관련 문제가 있다면 바로 삭제하도록 하겠습니다
'Java > Elegant Objects' 카테고리의 다른 글
[엘레강트 오브젝트] 2. 학습 - (4) 메서드 이름을 신중하게 선택하세요 (0) | 2021.09.12 |
---|---|
[엘레강트 오브젝트] 2. 학습 - (2) 최소한 뭔가는 캡슐화하세요 (0) | 2021.09.05 |
[엘레강트 오브젝트] 2. 학습 - (1) 가능하면 적게 캡슐화하세요 (0) | 2021.09.04 |
[엘레강트 오브젝트] 1. 출생 - (3) 생성자에 코드를 넣지 마세요 (0) | 2021.09.02 |
[엘레강트 오브젝트] 1. 출생 - (2) 생성자 하나를 주 생성자로 만드세요 (0) | 2021.09.02 |
댓글