#include <iostream>
using namesapce std;
class Character
{
    int gold = 0;
    int item = 0;
public:
    void run() { cout << "run" << endl; }
    void attact() { cout << "attack" << endl; }
};
int main()
{
    Character* p = new Chracter;
    p->run();
    p->attack();
}
item에 따라 run이나 attact함수에 영향을 주고 싶다
// 방법 1
// run, attact에 if문으로 구분을 준다.
void run() { 
    if(item == 1)
        cout << "run : 1" << endl; 
    else if(item == 2)
        cout << "run : 2" << endl;
}
누가 봐도 문제가 있는 방법이군…
문제
- 모든 동작에 함수에 조건 분기문이 필요
 - 새로운 아이템이 추가되면 조건문 속에 조건문이 들어가야한다.
 
// 방법 2
// 가상함수를 활용하자
class Character
{
    int gold = 0;
    int item = 0;
public:
    void run() { runImp(); }
    void attact() { attackImp(); }
    virtual void runImp() {}
    virtual void attackImp() {}
};
class PowerItemCharater : public Character
{
public:
    virtual void runImp() { cout << "run" << endl;}
}
int main()
{
    Character* p = new Chracter;
    p->run();
    p->attack();
    p = new PowerItemCharatcter;
    p->run();
    p->attack();
}
또 문제는 있다.
 위의 방식대로 선언하면 상태(gold정보 등)을 넘길수가 없다.
// 방법 3
struct IState
{
    virtual void run() = 0;
    virtual void attack() = 0;
    virtual ~IState() {}
};
class Character
{
    int gold = 0;
    int item = 0;
    IState* state;
public:
    void changeState(IState* p) { state = p; }
    void run() { state->run(); }
    void attact() { state->attatck(); }
};
class NormalState : public IState
{
    virtual void run() { cout << "run" << endl; }
    virtual void attack() { cout << "power attack" << endl; }
};
int main()
{
    NormalState ns;
    Chracter* p = new Chracter;
    p->changeState(&ns);
    p->run();
}
상태는 변경되지 않고 동작만 변경이 가능하다.