예를들어, 제가 카페를 차렸다고 가정해보겠습니다.
가게 오픈에 앞서 빵을 진열해 놓으려고 합니다.
저희 카페에 진열되어있는 빵은 파리바게트 빵입니다. 코드는 아래와 같습니다.
void main() {
final mycafe = MyCafe();
mycafe.displayBread();
}
// 나의 빵집
class MyCafe {
ParisBaguette parisbaguette = ParisBaguette();
// 빵 진열하기 메서드
void displayBread() {
int breadCount = parisbaguette.giveBreadCount();
String shopname = parisbaguette.name;
print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');
}
}
// 파리바게트
class ParisBaguette {
String name = '파리바게트';
int giveBreadCount() {
return 10;
}
}
결과
저희 카페는 파리바게트가 없으면 빵을 진열할 수가 없습니다. ㅜㅜ
MyCafe 클래스의 displayBread 메서드는 ParisBaguette 클래스가 없으면 실행 할 수 없습니다.
MyCafe 클래스는 ParisBaguette 클래스에 의존!! 하고 있습니다.
그렇다면 의존성 주입이란 말은 왜 생겨났을까요?
MyCafe를 차린 저는 이제 빵집을 뚜레주르로 바꾸려고 한답니다. (같은 가격에 2개를 더 얹어준다네요!? 속닥속닥)
displayBread 메서드는 변경할게 없고, 내부의 빵집만 바꿔주면 되겠죠?
근데 바꾸려고 보니, 바꿔야할게 많아요…
void main() {
final mycafe = MyCafe();
mycafe.displayBread();
}
// 나의 카페
class MyCafe {
// ParisBagutte를 TouslesJours로 변경해야 해!
ParisBaguette parisbaguette = ParisBaguette();
// 변경 후
TouslesJours touslesjours = TouslesJours();
// 빵 진열하기 메서드
void displayBread() {
// giveBreadCount → sendBreadCount 로 변경해야 해!
int breadCount = parisbaguette.giveBreadCount();
// 변경 후
int breadCount = touslesjours.sendBreadCount();
// name → shopName 로 변경해야 해!
String shopname = parisbaguette.name;
// 변경 후
String shopname = touslesjours.shopName;
print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');
}
}
// 뚜레주르
class TouslesJours {
String shopName = '뚜레주르';
int sendBreadCount() {
return 12;
}
}
결과
이렇게 하나하나 열심히 바꿔주고 나니까 너무 힘들어요.
나중에 빵집이 또 변경되면 또 바꿔줘야된다는 생각에 괴로워요.
그래서 빵집에 대한 정보를 외부에서 넣어주면(주입) 되겠다 생각하게 되었어요.
우선 빵을 진열할때 필요한 정보들을 통일 시켜서 정리해 보았어요.
print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');
이렇게 print를 실행시키기위해서는 빵집 명과 가져온 빵개수가 필요해요.
// 빵집들 추상 클래스
abstract class BreadShop {
// 빵집 명
String get breadShopName;
// 가져온 빵 개수 파악 메서드.
int giveBreadCount();
}
각각의 빵집에 해당 규칙을 적용해 줍니다.
// 파리바게트
class ParisBaguette extends BreadShop {
String breadShopName = '파리바게트';
int giveBreadCount() {
return 10;
}
}
// 뚜레주르
class TouslesJours extends BreadShop {
String breadShopName = '뚜레주르';
int giveBreadCount() {
return 12;
}
}
이제 의존성 주입을 해볼게요.
void main() {
// MyCafe mycafe = MyCafe(빵집을 골라서 넣어줄수 있어요.);
// ex) 파리바게트
MyCafe mycafe = MyCafe(ParisBaguette());
mycafe.displayBread();
}
class MyCafe {
BreadShop breadShop;
MyCafe(this.breadShop);
// 빵 진열하기 메서드
void displayBread() {
String shopname = breadShop.breadShopName;
int breadCount = breadShop.giveBreadCount();
print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');
}
}
결과
MyCafe를 생성해줄때 어떤 빵집을 사용할건지를 직접 골라서 넣어줄 수 있게 되었습니다.
의존성을 주입하는 것이죠!!
이제 어떤 다른 빵집이 생기더라도 BreadShop이라는 규칙을 지키게 만들어주면 내부의 코드를 수정할 필요가 없이 바로 적용할 수 있게 되었습니다.