요약 - 도형 계산기
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 63번째.
챌린지
쉬움다형성에 대해 배운 모든 것을 활용하여 도형 계산기를 만들어 봅시다. 추상 클래스인 Shape 클래스를 만들고, 공통 인터페이스를 통해 접근 가능한 면적과 둘레를 계산하는 구체적인 도형들을 구현할 것입니다.
코드는 다음 네 개의 파일로 구성됩니다:
Shape.h: 모든 도형의 청사진 역할을 하는 추상Shape클래스를 정의합니다. 기본 클래스에는 다음이 포함되어야 합니다:- 도형을 식별하기 위한 protected
std::string name멤버 - 이름을 초기화하는 생성자
double을 반환하는 순수 가상 함수area()및perimeter()- 도형의 이름을 반환하는
getName()메서드 - 가상 소멸자
- 도형을 식별하기 위한 protected
Circle.h:Shape를 상속받는Circle클래스를 구현합니다:- private
double radius멤버 - 반지름을 매개변수로 받는 생성자 (이름을
"Circle"로 설정) - 다음 공식을 사용하여
area()구현: 3.14159 * radius * radius - 다음 공식을 사용하여
perimeter()구현: 2 * 3.14159 * radius
- private
Rectangle.h:Shape를 상속받는Rectangle클래스를 구현합니다:- private
double width및double height멤버 - 너비와 높이를 매개변수로 받는 생성자 (이름을
"Rectangle"로 설정) area()를 width * height로 구현perimeter()를 2 * (width + height)로 구현
- private
main.cpp: 네 개의 입력값(각각 별도의 줄에 입력됨)을 읽습니다:- 원 반지름 (double)
- 직사각형 너비 (double)
- 직사각형 높이 (double)
- 두 번째 원 반지름 (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;
}