개념
- 시스템을 작고 독집적인 컴포넌트로 나누어 관리하는 방식.
- 각 컴포넌트는 특정 기능이나 속성을 캡슐화하며 여러 컴포넌트를 조합하여 더 복잡한 시스템을 구성.
- 객체 지향 설계의 확장된 개념으로, 유연성, 재사용성, 확장성을 강조.
특징
- 독립적 기능 : 각 컴포넌트는 독립적으로 동작하며, 다른 컴포넌트에 의존하지 않음.
- 구성 가능한 객체 : 여러 컴포넌트를 조합하여 객체를 구성.
예) Player 객체는 HealthComponent, DamageComponent 등을 결합하여 생성.
- 재사용성 : 컴포넌트는 다양한 객체에서 재사용 가능하여 코드 중복을 줄이고, 유지보수를
용이하게 함. (UI 시스템 )
- 유연성 : 필요한 컴포넌트를 추가, 변경할 수 있어 시스템 확장에 용이. (대규모 시스템)
- 테스트 용이성 : 각 컴포넌트는 독립적으로 테스트할 수 있음.
장점
- 확장성 : 새로운 기능 추가 시 기존 코드를 변경하지 않고 컴포넌트만 수정하여 확장 가능.
- 유연성 : 다양한 컴포넌트를 조합하여 다양한 객체를 생성할 수 있음.
- 재사용성 : 동일한 컴포넌트를 여러 객체에서 재사용하여 코드 중복을 줄임.
- 유지보수성 : 기능이 분리되어 있어, 특정 기능만 수정하거나 테스트할 수 있음.
한계점
- 디버깅 어려움 : 컴포넌트 간의 상호작용이 복잡해지면 문제를 추적하는데 어려움이 있음.
- 과도한 분리 : 지나치게 세분화된 컴포넌트는 관리가 복잡해질 수 있음.
예시코드
Character.h
class Character {
public:
Character(int health, int damage)
: healthComponent(health), damageComponent(damage) {}
void takeDamage(int damage) {
healthComponent.takeDamage(damage);
}
void attack(Character& target) {
target.takeDamage(damageComponent.getDamage());
}
void showHealth() const {
std::cout << "Health: " << healthComponent.getHealth() << std::endl;
}
InventoryComponent& getInventoryComponent() {
return inventoryComponent;
}
private:
HealthComponent healthComponent;
DamageComponent damageComponent;
InventoryComponent inventoryComponent;
};
- Character class는 여러가지 컴포넌트를 사용.
Healthcomponent.h
class HealthComponent {
public:
HealthComponent(int health) : health(health) {}
void takeDamage(int damage) {
health -= damage;
}
int getHealth() const {
return health;
}
private:
int health;
};
DamageComponent.h
class DamageComponent {
public:
DamageComponent(int damage) : damage(damage) {}
int getDamage() const {
return damage;
}
private:
int damage;
};
InventoryComponent.h
class InventoryComponent {
public:
void addItem(const std::string& item) {
inventory.push_back(item);
}
void removeItem(const std::string& item) {
inventory.remove(item);
}
void showItems() const {
for (const auto& item : inventory) {
std::cout << item << std::endl;
}
}
private:
std::list<std::string> inventory;
};
Main.cpp
int main() {
Character player(100, 20);
player.showHealth();
player.getInventoryComponent().addItem("Sword");
player.getInventoryComponent().showItems();
Character monster(50, 15);
player.attack(monster);
monster.showHealth();
return 0;
}