// 추상 클래스 (Abstraction) class Shape { public: virtual void draw() = 0; // 순수 가상 함수 (pure virtual function) virtual ~Shape() {} // 가상 소멸자 (virtual destructor) };
// 캡슐화 (Encapsulation) class Circle : public Shape { private: double radius; // 원의 반지름
public: Circle(double r) : radius(r) {} // 생성자
void draw() override { // 다형성 (Polymorphism) cout << "Drawing a Circle with radius: " << radius << endl; } };
// 상속 (Inheritance) class Rectangle : public Shape { private: double width, height; // 직사각형의 너비와 높이
void draw() override { // 다형성 (Polymorphism) cout << "Drawing a Rectangle with width: " << width << " and height: " << height << endl; } };
int main() { vector<unique_ptr<Shape>> shapes; // Shape 객체를 저장할 벡터
// 객체 생성 및 저장 shapes.push_back(make_unique<Circle>(5.0)); shapes.push_back(make_unique<Rectangle>(4.0, 6.0));
// 각 도형 그리기 for (const auto& shape : shapes) { shape->draw(); // 다형성을 통해 각 도형의 draw() 호출 }
return 0; } 코드 설명 추상화 (Abstraction):
Shape 클래스는 추상 클래스입니다. 이 클래스는 draw라는 순수 가상 함수(pure virtual function)를 가지고 있어, 실제 도형 클래스에서 반드시 구현해야 합니다. 캡슐화 (Encapsulation):
Circle 클래스와 Rectangle 클래스는 각각의 속성(radius, width, height)을 private으로 설정하여, 외부에서 직접 접근할 수 없도록 하고 있습니다. 각 클래스는 생성자를 통해 속성을 초기화합니다. 상속 (Inheritance):
Circle과 Rectangle 클래스는 Shape 클래스를 상속받습니다. 이를 통해 두 클래스는 Shape의 인터페이스를 구현하고, 공통된 기능을 공유할 수 있습니다. 다형성 (Polymorphism):
Shape 포인터를 사용하여 다양한 도형을 다룰 수 있습니다. shapes 벡터에 Circle과 Rectangle 객체를 저장하고, draw 메서드를 호출할 때 각 객체의 실제 타입에 따라 적절한 메서드가 호출됩니다. 이는 런타임에 결정되므로 다형성을 나타냅니다. 이 예제를 통해 C++에서 객체지향 언어의 특징을 잘 이해할 수 있습니다.