컴포넌트 기반 설계

김재혁·2025년 1월 17일
0

개념

  • 시스템을 작고 독집적인 컴포넌트로 나누어 관리하는 방식.
  • 각 컴포넌트는 특정 기능이나 속성을 캡슐화하며 여러 컴포넌트를 조합하여 더 복잡한 시스템을 구성.
  • 객체 지향 설계의 확장된 개념으로, 유연성, 재사용성, 확장성을 강조.

특징

  • 독립적 기능 : 각 컴포넌트는 독립적으로 동작하며, 다른 컴포넌트에 의존하지 않음.
  • 구성 가능한 객체 : 여러 컴포넌트를 조합하여 객체를 구성.
    예) 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;
}

0개의 댓글