반응형
C++에서의 DI(Dependency Injection)와 DIP(Dependency Inversion Principle)
✅ DIP(의존성 역전 원칙, Dependency Inversion Principle)
📌 정의
상위 모듈(정책 결정)은 하위 모듈(세부 사항)에 의존하면 안 되며, 둘 다 추상(인터페이스)에 의존해야 한다.
🎯 목적
- 구체적인 구현이 아니라 추상화된 인터페이스에 의존하여 유연한 구조 유지
- 코드 결합도 감소 → 변경에 강한 코드
📎 C++ 예시
// 상위 모듈은 추상 인터페이스에 의존
class ICommunication {
public:
virtual void send(const std::string& msg) = 0;
virtual ~ICommunication() = default;
};
// 하위 모듈은 실제 구현
class UartCommunication : public ICommunication {
public:
void send(const std::string& msg) override {
// UART로 전송
}
};
✅ DI(의존성 주입, Dependency Injection)
📌 정의
객체가 필요한 의존성을 직접 생성하지 않고 외부에서 주입받도록 설계하는 원칙
📦 주입 방식
방법 | 설명 |
---|---|
생성자 주입 | 가장 일반적. 주입된 객체를 멤버로 저장 |
세터 주입 | 생성 이후 필요한 의존성 주입 |
인터페이스 주입 | 주입 대상이 외부에서 주입받는 함수 제공 |
📎 생성자 주입 예시
class Controller {
ICommunication& comm;
public:
Controller(ICommunication& c) : comm(c) {}
void run() { comm.send("Start!"); }
};
🔄 DIP + DI 결합 설계 흐름 (C++ 기준)
class Botbox {
Controller controller;
public:
Botbox(ICommunication& comm)
: controller(comm) {} // DI
};
→ Botbox
는 구체적인 UART 객체를 모르고도 동작 가능
→ DIP: Controller는 ICommunication에 의존
→ DI: 생성자에서 comm을 주입
✅ 테스트와 확장에 유리한 이유
상황 | DIP/DI 적용 시 효과 |
---|---|
테스트할 때 | Mock 객체 주입 가능 |
기능 확장 (예: BLE) | 새로운 클래스(BLEComm)만 구현하면 됨 |
모듈 독립성 유지 | 컴파일 의존도 분리, 빌드 속도 향상 |
🧪 Mock 예시 (단위 테스트)
class MockComm : public ICommunication {
public:
std::string lastSent;
void send(const std::string& msg) override {
lastSent = msg; // 로그 저장
}
};
// 테스트 코드
MockComm mock;
Controller ctrl(mock);
ctrl.run();
assert(mock.lastSent == "Start!");
❗ C++에서 주의할 점
항목 | 주의 사항 |
---|---|
객체 수명 관리 | 참조 or 스마트 포인터로 수명 관리 필요 |
생성자 DI 시 순환 의존 조심 | A가 B를 필요로 하고 B도 A를 필요로 하면 구조 재검토 필요 |
동적 바인딩 비용 | 순수 가상 함수 사용 시 약간의 성능 손해 가능 (무시 수준) |
✅ 결론
- DIP는 "인터페이스에 의존하라"는 설계 원칙
- DI는 "의존성을 외부에서 주입"하여 DIP를 실현하는 구현 기술
- 둘을 잘 활용하면 유지보수성, 테스트, 확장성이 모두 향상
반응형
'언어 > C, C++' 카테고리의 다른 글
c, c++ 임베디드 설계 비교 (1) | 2025.05.21 |
---|---|
[c++] 로봇 시스템 상태 관리 및 로직 설계 (0) | 2025.05.20 |
[c++] 싱글톤 패턴 정리 (0) | 2025.05.19 |
[C++] #define, constexpr, PROGEM 비교 (0) | 2024.10.27 |
[C++] PROGEM (0) | 2024.10.26 |
댓글