어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이의 의존성이 존재하게 된다.
의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가짐
[예제]
→ 컴파일타임 의존성
⇒ 문제점 : Order가 FixedAmountVourcher를 사용하고 있는데 FixedAmountVourcher에 변화가 생기면 Order에도 큰 변화가 일어남
FixedAmountVourcher에서 discount로직을 수정하면 order의 tatalAmount계산로직에 변경이 일어나고 Assert.isTrue가 실패함
⇒ 강한 결합도
지금 의존성은 컴파일타임 의존성을 가지고 강한 결합도이다. 이를 개선하기 위해 느슨한 결합도로 변경해야하는데 이를 위해 런타임 의존성으로 변경해야한다.
FixedAmountVourcher는 이미 로직이 구현되어있는 구현체이므로 Voucher라는 인터페이스를 구현하자
⇒ 결합도에서 계속