Menu
Coddy logo textTech

도형 컨테이너

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

challenge icon

챌린지

쉬움

Shape Drawer 프로젝트를 대단원의 막으로 이끌어 봅시다! Circle과 Rectangle이 섞인 컬렉션을 담는 shape 컨테이너를 만들고, 이를 순회하여 전체 area를 계산하면서 다형성의 진정한 힘을 보여 주게 됩니다.

지금까지 만든 모든 것을 바탕으로 완성된 프로젝트에는 다음이 포함됩니다:

  • shape.hshape.c: 기본 Shape 인터페이스와 process_shape 함수입니다.
  • circle.hcircle.c: 생성자와 area 계산을 포함한 Circle 구현입니다.
  • rectangle.hrectangle.c: 생성자와 area 계산을 포함한 Rectangle 구현입니다.
  • main.c: 마법이 일어나는 곳입니다. 모든 shape 유형을 담을 수 있는 Shape* 포인터 array를 만듭니다. 여기에 Circle과 Rectangle을 섞어 채운 다음, array를 순회하며 모든 shape의 area 합계를 계산하고 표시합니다.

프로그램은 다음 입력을 받습니다:

  1. 생성할 shape의 개수
  2. 각 shape에 대해: 유형 표시자(c는 circle, r은 rectangle)와 그 뒤에 오는 dimensions

컨테이너의 각 shape에 대해 Shape* 포인터(shapes[i]->draw(shapes[i]), shapes[i]->area(shapes[i]))를 통해 직접 drawarea를 호출하고, area를 누적 합계에 더합니다. 여기서는 shape.cprocess_shape를 사용하지 마세요. 이 함수는 각 shape마다 예상 출력에 포함되지 않는 추가 Area: 줄을 출력하기 때문입니다. 모든 shape을 처리한 후, Total Area: X.XX 형식으로 소수점 이하 2자리까지 전체 area를 출력합니다.

입력이 3이고, 이어서 c 5.0, r 4.0 3.0, c 2.0인 예시:

Drawing Circle with radius: 5.00
Drawing Rectangle with width: 4.00 and height: 3.00
Drawing Circle with radius: 2.00
Total Area: 103.11

입력이 2이고, 이어서 r 6.0 4.0, r 3.0 2.0인 예시:

Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00

핵심은 array가 Shape* 포인터를 저장한다는 점입니다. 각 요소가 실제로 Circle인지 Rectangle인지는 중요하지 않습니다. 각 포인터를 통해 순회하며 drawarea를 호출하면, 각 shape이 생성된 방식에 따라 올바른 구현이 자동으로 실행됩니다. 이것이 바로 다형성의 작동 방식입니다. 하나의 loop, 하나의 인터페이스, 여러 동작입니다.

구체적인 shape의 내장된 Shape 멤버에 대한 포인터를 array에 저장해야 한다는 점을 기억하세요. circle area 계산에서는 π에 3.14159를 사용하세요.

중요: shape 유형 문자 읽기: scanf("%d", &n)으로 shape의 개수를 읽은 후, 유형 문자를 읽는 각각의 후속 호출에서는 입력 버퍼에 남아 있는 줄바꿈을 건너뛰어야 합니다. 형식 문자열에 선행 공백을 넣어 이 작업을 수행하세요:

scanf(" %c", &type);  // note the space before %c

선행 공백이 없으면 scanf는 의도한 c 또는 r 대신 이전 입력에서 남은 줄바꿈 문자를 읽습니다. 그러면 shape 유형 검사가 조용히 실패하여 출력이 생성되지 않습니다.

직접 해보기

#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: 도형의 개수를 읽기
    // TODO: circles, rectangles, Shape* 포인터를 위한 배열 할당
    // TODO: 각 도형을 순회하며 유형과 크기를 읽고,
    //       도형을 생성한 뒤 베이스에 대한 포인터를 shapes 배열에 저장
    // TODO: shapes 배열을 순회하며 shapes[i]->draw(...)와
    //       shapes[i]->area(...)를 직접 호출하고 총 면적을 누적
    //       (process_shape를 호출하지 말 것: 추가 Area 줄을 출력함)
    // TODO: 총 면적을 다음 형식으로 출력: Total Area: X.XX
    // TODO: 할당된 메모리 해제
    return 0;
}

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

직접 연습해 보세요: 온라인 C 컴파일러