"A가 B를 의존한다." -> B가 변하면 A에 영향을 미치는 관계
의존관계를 인터페이스로 추상화하면 더 다양한 의존관계를 맺을 수 있고, 실제 구현 클래스와의 관계가 느슨해져 결합도가 낮아진다.
class BurgerChef {
private BurgerRecipe burgerRecipe;
public BurgerChef() {
burgerRecipe = new HamBurgerRecipe();
//burgerRecipe = new CheeseBurgerRecipe();
//burgerRecipe = new ChickenBurgerRecipe();
}
}
interface BugerRecipe {
newBurger();
// 이외의 다양한 메소드
}
class HamBurgerRecipe implements BurgerRecipe {
public Burger newBurger() {
return new HamBerger();
}
// ...
}
생성자 또는 메서드 등을 통해 외부로부터 생성된 객체를 전달 받는 것
의존성이 줄어든다.
주입받는 대상이 변하더라도 그 구현 자체를 수정할 일이 없거나 줄어들게된다.
재사용성이 높아진다.
다른 클래스에서 재사용할 수 있다.
테스트하기 좋다.
분리해서 테스트를 진행할 수 있다.
유연성과 확장성 향상
결합도가 낮아져 유연성과 확장성을 향상시킨다.
의존성 주입을 해주기 위해서는 의존성들을 일일이 넣어줘야 합니다.
만약 잘못 코드를 작성하면 의존성 관계가 복잡해질 수 있습니다.
그래서 보통 의존성 주입을 별도로 관리해주는 라이브러리나 프레임워크를 사용합니다.
코드의 흐름을 제어하는 주체가 바뀌는 것