모든 소프트웨어 모듈에는 세가지 목적이 있다.
→ 제대로 동작하고, 읽기 쉽고, 변경에 용이한 코드를 작성하는 것이 목표이다!
다음 코드의 문제점을 살펴보자.
public class Theater {
private TicketSeller seller;
public 생성자 { ... }
public void enter(Audience audience) {
if (audience.getBag().hasInvitation()) {
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().setTicket(ticket);
} else {
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().minusAmountticket.getFee();
ticketSeller.getTicketoffice().plusAmount(ticket.getFee());
audience.getBag().setTicket(ticket);
}
}
}
위 코드는 크게 두 가지 문제가 있다.
이해하기가 어렵다.
Theater가 너무 많은 사실을 알고 핸들링한다. audience의 가방을 뒤져서 티켓 확인하고 돈 빼고 등등 이런 일들을 하고 있는데 이건 현실 세계의 모습과 너무 다르다.
→ 코드 읽는 사람이 이해하기도 어렵고 전체적인 클래스 구조를 다 파악해야 이해할 수 있는 상태이다.
변경에 취약하다.
의존성은 변경과 관련되어있다. 어떤 객체가 변경되면 그 객체에 의존하고 있는 객체들은 함께 변경될 수 있다는 의미이다.
그렇다고 객체지향에서 객체사이에 의존성을 없애는 것은 불가능하다. 객체지향 설계 자체가 서로 의존하면서 협력하는 객체들의 공동체를 구축하는 것이기 때문이다. 다만 애플리케이션 기능을 구현하는데 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거하는 것이 중요하다.
객체 사이에 의존성이 과한 경우를 가리켜 결합도(Coupling)이 높다고 한다. 반대로 객체들이 합리적인 수준으로 의존할 경우에는 결합도가 낮다고 말한다.