디자인 패턴4 4. State Pattern 어떤 게임을 예로 들면, 캐릭터가 있고, 캐릭터가 아이템을 획득해서 공격 방식과 이동 속도가 변한다고 가정한다. 그걸 캐릭터 코드에서 해결한다고 하면 아래와 같이 투박하게 처리가 가능할 것이다. class Character { public: void Attack() { if ( normal ) ... if ( item ) ... } void Run() { if ( normal ) ... if ( item ) ... } private: } - 그러나 이렇게 처리하면 모든 아이템에 대해 if 분기문을 걸어줘야 하며, - 기존 코드를 손봐야 하는 문제가 생긴다. (OCP 위반) 이는 상태 패턴을 사용해서 아래와 같이 처리할 수 있다. struct IState { virtual void Attack() = 0;.. 2023. 2. 10. 3. Template Method & Strategy Pattern 변하는 부분을 분리하는 방법 EditBox라는 클래스가 있다. 이 박스에 입력을 받을 때, Name 란에는 문자열만, Phone 란에는 숫자만 입력받게 하고 싶다. 그러려면 EditBox 내부에서 한 글자씩 받아서 그걸 필터하는 함수를 사용해야 하는데, 이 부분을 어떻게 처리하면 좋을까? 1. Template method 패턴 - 가상 함수로 분리하기 - 필터하는 부분을 가상함수로 만들어서 상속받는 클래스에서 재정의한다. - 전체적인 흐름을 Template method 부분이라고 하며, - 가상함수로 재정의되는 부분을 Hook Method라고 한다. - 알고리즘의 전체 구조는 기반 클래스에 정의되며 그 중 특정 단계는 파생 클래스에서 책임진다. 2. Strategy 패턴 - 클래스로 분리하기 - 교체 가.. 2023. 2. 9. 2. 인터페이스와 커플링 나중에 추가된 코드 때문에 기존 코드를 수정해야 한다? 유지보수 차원에서 문제가 될 수 있다! 따라서 코드를 작성할 때 확장성을 고려해야 한다. 객체지향의 SOLID원칙 중 OCP(개방폐쇄법칙) - 기능 확장에는 열려 있고, 코드 수정에는 닫혀 있어야 한다. - 새로운 기능이 추가되어도 기존 코드의 수정이 없어야 한다. #include #include using namespace std; struct ICamera { virtual void take() = 0; virtual ~ICamera() {} } class Camera : public ICamera { public: void take() { cout 2023. 2. 8. 1. protected 생성자 & 소멸자 protected에 생성자가 있는 경우 생성자가 protected에 있는 경우, 외부에서 생성할 수 없다. 파생 클래스의 생성자에서만 불릴 수 있다. class Animal { public: virtual ~Animal() {} protected: Animal() {} }; class Dog : public Animal { public: Dog() {} }; *기반 클래스의 생성자와 파생 클래스의 생성자 중 어떤 게 먼저 불릴까? - 보통 기반 클래스의 생성자가 먼저 불린다고 알고 있지만 (결과적으로는 맞음) - 파생 클래스가 먼저 불리고 거기서 기반 클래스를 먼저 실행시키는 것 - 단지 그 시점이 파생 클래스 생성자 내부의 코드를 실행하기 전이라서 먼저 기반 클래스의 코드가 먼저 실행되는 것 뿐임 Do.. 2023. 2. 8. 이전 1 다음