이 예제 코드와 주석을 상세히 분석하겠습니다.
#include <iostream>
using namespace std;
#include <iostream>
: C++ 표준 라이브러리에서 입출력을 위한 헤더 파일입니다. cout
을 사용하기 위해 포함합니다.using namespace std;
: std
네임스페이스를 사용하여 코드에서 std::cout
대신 cout
을 직접 사용할 수 있도록 합니다.class Shape
{
public:
virtual double getArea() const = 0; // 순수 가상 함수 문법
virtual ~Shape() {}
};
class Shape
: Shape
라는 이름의 추상 클래스를 정의합니다.virtual double getArea() const = 0;
: 순수 가상 함수(pure virtual function)입니다. = 0
은 이 함수가 자식 클래스에서 반드시 구현되어야 함을 나타냅니다. const
는 함수가 멤버 변수를 변경하지 않음을 명시합니다.virtual ~Shape() {}
: 가상 소멸자입니다. Shape
클래스가 추상 클래스이므로, 자식 클래스가 삭제될 때 적절하게 소멸되도록 보장합니다.설명:
class Circle : public Shape
{
private:
double _radius;
public:
Circle(double radius)
: _radius(radius)
{
}
virtual double getArea() const override
{
return _radius * _radius * 3.14;
}
};
class Circle : public Shape
: Shape
클래스를 상속받는 Circle
클래스입니다.double _radius;
: Circle
클래스의 멤버 변수로 반지름을 저장합니다.Circle(double radius) : _radius(radius)
: 생성자입니다. 초기화 리스트를 사용하여 _radius
를 radius
로 초기화합니다.virtual double getArea() const override
: Shape
클래스의 순수 가상 함수 getArea
를 재정의합니다. 원의 면적을 계산해 반환합니다.설명:
Circle
클래스는 Shape
클래스를 상속받아 getArea
함수를 구현해야 합니다. override
키워드는 부모 클래스의 가상 함수를 재정의하고 있음을 명시합니다.class Rectangle : public Shape
{
private:
double _width;
double _height;
public:
Rectangle(double width, double height)
: _width(width), _height(height)
{
}
virtual double getArea() const override
{
return _width * _height;
}
};
class Rectangle : public Shape
: Shape
클래스를 상속받는 Rectangle
클래스입니다.double _width;
, double _height;
: Rectangle
클래스의 멤버 변수로 너비와 높이를 저장합니다.Rectangle(double width, double height) : _width(width), _height(height)
: 생성자입니다. 초기화 리스트를 사용하여 _width
와 _height
를 초기화합니다.virtual double getArea() const override
: Shape
클래스의 순수 가상 함수 getArea
를 재정의합니다. 직사각형의 면적을 계산해 반환합니다.설명:
Rectangle
클래스 역시 Shape
클래스를 상속받아 getArea
함수를 구현합니다. Circle
과 마찬가지로 면적 계산 로직이 다릅니다.class AreaAverage
{
private:
double _total = 0;
int _size = 0;
public:
double operator()(Shape& shape)
{
_size += 1;
_total += shape.getArea();
return _total / _size;
}
};
class AreaAverage
: 도형의 평균 면적을 계산하는 클래스입니다.double _total = 0;
: 면적의 총합을 저장하는 멤버 변수입니다.int _size = 0;
: 면적을 계산한 도형의 개수를 저장하는 멤버 변수입니다.double operator()(Shape& shape)
: 함수 호출 연산자 오버로딩입니다. Shape
타입의 객체 참조를 매개변수로 받아, 해당 도형의 면적을 getArea
로 가져옵니다. size
를 증가시키고 total
에 면적을 더한 후, 평균 면적을 반환합니다.설명:
AreaAverage
클래스는 Shape
객체를 반복적으로 전달받아 평균 면적을 계산합니다.int main()
{
// Shape s; // 추상 클래스는 생성할 수 없다
Circle c(10);
cout << c.getArea() << endl;
Rectangle r(10, 20);
cout << r.getArea() << endl;
// 추상 클래스는 생성할 수 없지만 가리킬 수는 있다.
Shape* s0 = &c;
Shape& s1 = r;
cout << s0->getArea() << endl;
cout << s1.getArea() << endl;
//
AreaAverage aavg;
cout << aavg(c) << endl;
cout << aavg(r) << endl;
}
Circle c(10);
: 반지름이 10인 Circle
객체를 생성합니다.cout << c.getArea() << endl;
: Circle
의 면적을 출력합니다.Rectangle r(10, 20);
: 너비 10, 높이 20인 Rectangle
객체를 생성합니다.cout << r.getArea() << endl;
: Rectangle
의 면적을 출력합니다.Shape* s0 = &c;
: 추상 클래스인 Shape
는 인스턴스를 만들 수 없지만, 포인터를 통해 자식 클래스를 가리킬 수 있습니다.Shape& s1 = r;
: 참조를 통해 Shape
타입으로 자식 클래스를 다룰 수 있습니다.AreaAverage aavg;
: 평균 면적 계산을 위한 AreaAverage
객체를 생성합니다.cout << aavg(c) << endl;
: Circle
의 면적을 AreaAverage
객체에 전달하여 평균을 출력합니다.cout << aavg(r) << endl;
: Rectangle
의 면적을 AreaAverage
객체에 전달하여 평균을 출력합니다.Shape
는 순수 가상 함수 getArea
를 정의하여 인터페이스 역할을 합니다.Circle
과 Rectangle
은 Shape
를 상속받아 getArea
를 구현합니다.AreaAverage
클래스는 도형들의 평균 면적을 계산하는 기능을 제공합니다.