본문 바로가기
프로그래밍 이야기/C++ 기초

[C++] 예제로 배우는 객체 지향(Prototype Pattern)

by Mulder5 2020. 11. 25.
반응형

Copy & Paste 기능 추가하기

타입코드를 사용하는 방법

  • 새로운 도형이 추가되면 기존 코드가 수정(추가)된다.
  • OCP 만족하지 못한다.

가상함수를 사용하는 방법

  • 새로운 도형이 추가 되어도 기존 코드가 수정되지 않는다.
  • OCP 만족한다.
  • "Prototype"이라 불리는 디자인 패턴
// Exmaples.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//

#include <iostream>
#include <vector>

using namespace std;

class Shape
{
public:
    int type;
    virtual void Draw() { cout << "Draw Shape" << endl; }
    
    // 복사본을 만드는 가상 함수
    virtual Shape* Clone() { return new Shape(*this); }

};
class Rect :public Shape
{
public:
    Rect() { type = 1; }
    // 오버라이드 된 가상 함수는 Virtual 키워드를 생략가능하지만 되도록 명시 해주는 것이 좋다. 
    virtual void Draw() { cout << "Draw Rect" << endl; }

    virtual Shape* Clone() { return new Rect(*this); }
};

class Circle : public Shape
{
public:
    Circle() { type = 2; }
    virtual void Draw() { cout << "Draw Circle" << endl; }

    virtual Shape* Clone() { return new Circle(*this); }
};

class Triangle : public Shape
{
public:
    Triangle() { type = 3; }
    virtual void Draw() { cout << "Draw Triangle" << endl; }

    virtual Shape* Clone() { return new Triangle(*this); }
};

int main()
{
    // OCP를 고려한 코딩을 해보자. 
    vector<Shape*> v;

    while (1)
    {
        int cmd;
        cin >> cmd;

        if (cmd == 1) v.push_back(new Rect);
        else if (cmd == 2) v.push_back(new  Circle);
        else if (cmd == 8)
        {
            cout << " index >> ";
            int k;
            cin >> k;
            // k번째 도형의 복사본을 v에 추가한다. 
            
            // [문제점] 코딩하는 중에는 어떤 도형이 들어올지 모른다.
            // 보통 클래스 별로 Type을 정의한다. C에서 사용하는 전형적인 코딩 방법 
            //  -> 새로운 도형이 추가되면 기존 코드가 수정된다. 
            //  -> CCP를 만족하지 못해서 좋은 방법이 아니다.
            //  ---> 가상함수를 사용하는 방법

            /*switch (v[k]->type)
            {
            case 1:
            case 2:
            case 3:
                break;
            }*/

            v.push_back(v[k]->Clone()); // 다형성 -> 새로운 코드가 추가되어도 기존 코드가 수정될 필요가 없다. -> OCP 만족
            // "Prototype"이라 불리는 디자인 패턴 
            // 기존의 객체의 복사본을 만들어서 새로운 객체를 만들어가는 과정


        }
        else if (cmd == 9)
        {
            for (auto p : v)
            {
                p->Draw();  // 다형성

            }
        }
    }
}
반응형