의존성이란 종속성이라고도 하며 A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 된다는 것을 의미한다.
메인 모듈(main module)이 ‘적접’ 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자(dependency injector)가 이 부분을 가로채 메인 모듈이 ‘간접’적으로 의존성을 주입하는 방식이다.
이를 통해 메인 모듈(상위 모듈)은 하위 모듈에 대한 의존성이 떨어지게 된다.
이를 ‘디커플링이 된다’고도 한다.
"A가 B에 의존한다" = A 안에 B가 있다
즉, 의존하는 쪽(A) 안에 의존받는 대상(B)이 있다.
// 자동차(A)가 엔진(B)에 의존
public class Car { // A (의존하는 쪽)
private Engine engine; // B (의존받는 대상)
public void start() {
engine.turnOn(); // 엔진이 없으면 자동차가 작동 안됨
}
}
public class Engine { // B
public void turnOn() {
System.out.println("부릉부릉");
}
}
"의존성을 준다"는 표현이 헷갈릴 수 있는데, 정확히는:
public class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // Car가 Engine을 직접 생성
}
}
public class Car {
private Engine engine;
public Car(Engine engine) { // 외부에서 Engine을 주입받음
this.engine = engine;
}
}
// 의존성 주입자가 관리
Car car = new Car(new Engine()); // 외부에서 Engine을 만들어서 넣어줌
public class Main { // ← 이 Main이 의존성 주입자 역할
public static void main(String[] args) {
Engine engine = new Engine(); // Main이 Engine 생성
Car car = new Car(engine); // Main이 Car에 Engine을 주입
}
}
"의존성을 준다"는 표현보다는 "의존성을 가진다" 또는 "의존성을 주입받는다"가 더 정확한 표현
프로그래밍을 공부하면서 자주 접하는 '의존성', '의존하다', '의존성을 주다'라는 표현들이 막상 쓰일 때마다 애매하고 모호하게 다가왔다. 그래서 이번 기회에 이 개념들을 좀 더 명확히 이해하기 위해 정리해 두었다.