의존성 주입
문제
-> 할인 조건을 변경할 때마다, 기존의 Kiosk
의 코드를 바꿔야 했다.
-> 변화와 확장에 유연하지 않다.
목적지
-> 할인 조건을 변경해도 기존의 코드를 변경하지 않아야 한다.
문제 원인 추적
-> 할인 조건을 변경함에 따라 바꿔야하 하는 코드
- 참조변수 선언 및 초기화부
- Kiosk가 어떤 할인 조건 클래스의 인스턴스를 사용할지 직접 결정하고, 직접 생성하고 있다.
- 참조변수의 타입이 구체적인 클래스 타입이다.
- discount() 호출부
- 구체적인 클래스 타입의 참조변수를 통해
discount()
를 호출한다.
문제 해결 방법
Kiosk
가 할인 조건 인스턴스를 직접 결정하지 못하게, 직접 생성하지 못하게 해야 한다.
- 어떻게? -> 외부에서 결정하고 생성해서 전달해주어야 한다.
- 구체적인 클래스 타입의 참조변수가 아닌,
discount()
메서드를 가지고 있음을 보장 받는 무언가를 통해 discount()
를 호출해야 한다.
- 어떻게? -> 추상메서드를 활용해서 메서드를 가지고 있음을 보장해야 한다.
- 추상 메서드를 사용할 수 있는 문법 요소는? 추상클래스, 인터페이스
문제 해결 과정 -> DI 적용
- 인터페이스를 만들고, Kiosk가 사용하는 메서드를 추상 메서드로 정의한다.
- Kiosk가 사용하게 될 객체들이 인터페이스를 구현하게 한다.
- Kiosk에서 인터페이스 타입의 참조변수를 만든다.
- Kiosk가 사용할 인스턴스를 외부로부터 받아올 수 있게 생성자를 정의한다.
- 인터페이스 타입의 참조변수를 통해
discount()
를 호출한다.
- Kiosk를 인스턴스화하는 부분에서 생성자의 인자를 추가해준다.