Menu
Coddy logo textTech

요약 - 도형 계산기

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 63번째.

challenge icon

챌린지

쉬움

다형성에 대해 배운 모든 것을 활용하여 도형 계산기를 만들어 봅시다. 추상 클래스인 Shape 클래스를 만들고, 공통 인터페이스를 통해 접근 가능한 면적과 둘레를 계산하는 구체적인 도형들을 구현할 것입니다.

코드는 다음 네 개의 파일로 구성됩니다:

  • Shape.h: 모든 도형의 청사진 역할을 하는 추상 Shape 클래스를 정의합니다. 기본 클래스에는 다음이 포함되어야 합니다:
    • 도형을 식별하기 위한 protected std::string name 멤버
    • 이름을 초기화하는 생성자
    • double을 반환하는 순수 가상 함수 area()perimeter()
    • 도형의 이름을 반환하는 getName() 메서드
    • 가상 소멸자
  • Circle.h: Shape를 상속받는 Circle 클래스를 구현합니다:
    • private double radius 멤버
    • 반지름을 매개변수로 받는 생성자 (이름을 "Circle"로 설정)
    • 다음 공식을 사용하여 area() 구현: 3.14159 * radius * radius
    • 다음 공식을 사용하여 perimeter() 구현: 2 * 3.14159 * radius
  • Rectangle.h: Shape를 상속받는 Rectangle 클래스를 구현합니다:
    • private double widthdouble height 멤버
    • 너비와 높이를 매개변수로 받는 생성자 (이름을 "Rectangle"로 설정)
    • area()를 width * height로 구현
    • perimeter()를 2 * (width + height)로 구현
  • main.cpp: 네 개의 입력값(각각 별도의 줄에 입력됨)을 읽습니다:
    1. 원 반지름 (double)
    2. 직사각형 너비 (double)
    3. 직사각형 높이 (double)
    4. 두 번째 원 반지름 (double)

    세 개의 도형을 모두 동적으로 생성하고 Shape* 포인터 배열에 저장합니다. 배열을 순회하며 각 도형에 대해 다음 형식으로 정보를 출력합니다:

    <name>:
      Area: <area>
      Perimeter: <perimeter>

    각 도형 사이에 빈 줄을 출력하세요. 작업이 끝나면 동적으로 할당된 객체들을 정리(메모리 해제)하세요.

예를 들어, 입력값이 5, 4, 6, 3인 경우:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

동일한 로직이 어떤 도형 타입에 대해서도 어떻게 작동하는지 주목해 보세요. 이것이 바로 다형성의 힘입니다. 여러분의 코드는 Shape 인터페이스를 통해 원과 직사각형을 동일하게 처리하며, 각 도형은 자신의 측정값을 계산하는 방법을 알고 있습니다. 올바른 함수 시그니처를 보장하기 위해 모든 오버라이드된 메서드에 override 키워드를 사용하세요.

직접 해보기

#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"

using namespace std;

int main() {
    // 입력 읽기
    double circleRadius1, rectWidth, rectHeight, circleRadius2;
    cin >> circleRadius1;
    cin >> rectWidth;
    cin >> rectHeight;
    cin >> circleRadius2;

    // TODO: 3개의 요소를 가진 Shape* 포인터 배열 생성
    // Shape* shapes[3];

    // TODO: 도형을 동적으로 생성하고 배열에 저장
    // shapes[0] = new Circle(...);
    // shapes[1] = new Rectangle(...);
    // shapes[2] = new Circle(...);

    // TODO: 배열을 순회하며 각 도형의 정보 출력
    // 형식:
    // <name>:
    //   Area: <area>
    //   Perimeter: <perimeter>
    // (도형 사이에 빈 줄을 넣되, 마지막 도형 뒤에는 넣지 않음)

    // TODO: 동적으로 할당된 객체 정리
    // delete shapes[i];

    return 0;
}

객체 지향 프로그래밍의 모든 레슨