추상 클래스, 순수 가상 함수

Jaemyeong Lee·2024년 11월 4일
0

FastCampusC++

목록 보기
71/78

이 예제 코드와 주석을 상세히 분석하겠습니다.

#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 클래스가 추상 클래스이므로, 자식 클래스가 삭제될 때 적절하게 소멸되도록 보장합니다.

설명:

  • 추상 클래스는 순수 가상 함수를 포함하는 클래스입니다. 이를 통해 자식 클래스가 해당 함수를 구현하도록 강제합니다. 인터페이스 역할을 합니다.

Circle 클래스 정의

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): 생성자입니다. 초기화 리스트를 사용하여 _radiusradius로 초기화합니다.
  • virtual double getArea() const override: Shape 클래스의 순수 가상 함수 getArea를 재정의합니다. 원의 면적을 계산해 반환합니다.

설명:

  • Circle 클래스는 Shape 클래스를 상속받아 getArea 함수를 구현해야 합니다. override 키워드는 부모 클래스의 가상 함수를 재정의하고 있음을 명시합니다.

Rectangle 클래스 정의

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과 마찬가지로 면적 계산 로직이 다릅니다.

AreaAverage 클래스 정의

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 객체를 반복적으로 전달받아 평균 면적을 계산합니다.

main 함수

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를 정의하여 인터페이스 역할을 합니다.
  • CircleRectangleShape를 상속받아 getArea를 구현합니다.
  • AreaAverage 클래스는 도형들의 평균 면적을 계산하는 기능을 제공합니다.
  • 추상 클래스는 객체 생성이 불가능하지만, 포인터나 참조를 통해 자식 클래스를 다룰 수 있습니다.
profile
李家네_공부방

0개의 댓글