반응형
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(); // 다형성
}
}
}
}
반응형
'프로그래밍 이야기 > C++ 기초' 카테고리의 다른 글
[C++]Design Pattern - 변하는 것을 분리하기 (0) | 2020.12.01 |
---|---|
[C++]Design Pattern - 변하는 것을 분리하기 (0) | 2020.12.01 |
[C++] 예제로 배우는 객체 지향 #1 (0) | 2020.11.24 |
[C++] Protected Contructor (0) | 2020.11.24 |
[C++]Casting, Virtual function (0) | 2020.11.24 |