모든 소프트웨어 모듈에는 세가지 목적이 있다.

  1. 실행 중에 제대로 동작하는 것
  2. 변경을 위해 존재하는 것 → 대부분의 모듈은 생명주기 동안 변경되기 때문에 간단한 작업으로도 변경이 가능해야한다.
  3. 코드를 읽는 사람과 소통할 것 → 모듈은 특별한 훈련 없이도 개발자가 쉽게 읽고 이해할 수 있어야 한다.

→ 제대로 동작하고, 읽기 쉽고, 변경에 용이한 코드를 작성하는 것이 목표이다!

다음 코드의 문제점을 살펴보자.

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);
		}
	}	
}

위 코드는 크게 두 가지 문제가 있다.

  1. 이해하기가 어렵다.

  2. 변경에 취약하다.

의존성은 변경과 관련되어있다. 어떤 객체가 변경되면 그 객체에 의존하고 있는 객체들은 함께 변경될 수 있다는 의미이다.

그렇다고 객체지향에서 객체사이에 의존성을 없애는 것은 불가능하다. 객체지향 설계 자체가 서로 의존하면서 협력하는 객체들의 공동체를 구축하는 것이기 때문이다. 다만 애플리케이션 기능을 구현하는데 필요한 최소한의 의존성만 유지하고 불필요한 의존성을 제거하는 것이 중요하다.

객체 사이에 의존성이 과한 경우를 가리켜 결합도(Coupling)이 높다고 한다. 반대로 객체들이 합리적인 수준으로 의존할 경우에는 결합도가 낮다고 말한다.