보통의 객체지향 프로그램을 작성한다고 했을 때 "다형성"의 특징을 이용한다.
다형성은 쉽게 말해 하나의 타입으로 여러형태의 객체를 다를 수 있는 특징이다.
코드로 살펴보면
앞으로 그림을 그리는 프로그램을 만든다고 해보자 그림을 그리는 프로그램은 필요한 객체들을 모두 그린다는 요구사항이있다.
현재 필요한 객체는 '사각형' '원'이다. 이러한 요구사항을 가지고 있을 때 객체지향의 다형성을 가지고 어떻게 프로그램을 구현할 수 있을까?
구현방법
1. Shape 인터페이스를 만든다. 인터페이스에서는 Draw 함수가 정의되어있다.
2. 원, 사각형은 Shape의 함수를 구현한다.
3. main 함수에서 각 객체를 그려준다.
코드
Shape Class
struct Point
{
double x;
double y;
};
class Shape
{
public:
explicit Shape() = default;
virtual ~Shape() = default;
virtual void draw() const = 0;
};
Circle Class
class Circle : public Shape {
public:
explicit Circle(double radius):
radius_{radius}{}
double radius() const{
return radius_;
}
Point cetner() const{return center_;}
// Shape을(를) 통해 상속됨
void draw() const override
{
std::cout << "draw circle" << std::endl;
}
private:
double radius_;
Point center_{0,0};
};
Square Class
class Square :public Shape {
public:
// Shape을(를) 통해 상속됨
void draw() const override{
std::cout << "square draw" << std::endl;
}
explicit Square(double side) :side_{side} {}
Point center() const { return center_; };
private:
double side_;
Point center_{0,0};
};
main
void drawAllShapes(std::vector<std::unique_ptr<Shape>> const& shapes) {
for (std::unique_ptr<Shape> const& shape : shapes) {
shape->draw();
}
}
int main(){
std::cout << "hello world" << std::endl;
std::vector<std::unique_ptr<Shape>> shapes;
shapes.emplace_back(std::make_unique<Circle>(2.3));
shapes.emplace_back(std::make_unique<Square>(1.2));
shapes.emplace_back(std::make_unique<Circle>(4.1));
shapes.emplace_back(std::make_unique<Circle>(4.2));
drawAllShapes(shapes);
}
이것이 우리가 주로 사용하는 다형성을 이용한 프로그램이다.
그런데 코드를 작성하다보니 문득 이런의문이 생긴다. Circle이랑 Square 객체 자기자신을 직접 그리는게 맞을까? Circle, Square는 누군가가 그려주는 객체들이 아닐까? 만약 이런 의문이 들었다면 객체에서 그리는 행위를 분리해보자!
"그림을 그리는 프로그램" 에서 핵심은 그림을 그리는것이다. 이 말 뜻은 그림을 그리는것은 언제든지 변화할 수 있다는 말이다.
중요한만큼 변경이 많을테니깐 앞으로 우리는 그리는 행위에 대해서 많이 논의해보자
'C++' 카테고리의 다른 글
C++ Software-Design Study - 2 (0) | 2025.05.20 |
---|