Menu
Coddy logo textTech

다형성 활용

Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 47번째.

challenge icon

챌린지

쉬움

기본 Shape* 포인터를 통해 원이든 사각형이든 어떤 도형이라도 처리할 수 있는 함수를 작성하여 다형성이 실제로 어떻게 작동하는지 증명해 봅시다.

기존의 Circle 및 Rectangle 구현을 바탕으로, 모든 도형 유형을 균일하게 다루는 강력한 추상화인 단일 함수를 추가하게 됩니다.

프로젝트에는 다음 파일들이 포함됩니다:

  • shape.h: DrawFuncAreaFunc 타입을 포함하는 기본 Shape 인터페이스입니다.
  • circle.hcircle.c: 이전 레슨에서 구현한 Circle 구현체입니다.
  • rectangle.hrectangle.c: 이전 레슨에서 구현한 Rectangle 구현체입니다.
  • shape.c: Shape* 포인터를 인자로 받는 process_shape라는 새로운 함수를 구현합니다. 이 함수는 도형의 draw 함수를 호출한 다음, area 함수를 호출하고 그 결과를 소수점 둘째 자리까지 Area: X.XX 형식으로 출력해야 합니다.
  • main.c: 다형성이 실제로 작동하는 모습을 보여줍니다. 도형 유형 식별자(원인 경우 c, 사각형인 경우 r)와 필요한 치수를 읽습니다. 적절한 도형을 생성한 다음, 해당 도형에 내장된 Shape 멤버의 포인터를 process_shape에 전달합니다. 동일한 함수가 두 유형을 모두 처리합니다!

프로그램은 다음 중 하나를 입력받습니다:

  • c와 그 뒤에 오는 반지름 값, 또는
  • r과 그 뒤에 오는 너비 및 높이 값

입력이 c5.0일 때의 출력 예시:

Drawing Circle with radius: 5.00
Area: 78.54

입력이 r, 4.0, 3.0일 때의 출력 예시:

Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00

여기서 마법 같은 점은 process_shape가 자신이 Circle과 작업하는지 Rectangle과 작업하는지 전혀 모른다는 것입니다. 오직 Shape 인터페이스만 알고 있을 뿐입니다. 구체적인 도형의 내장된 Shape 멤버를 Shape*로 캐스팅함으로써, 어떤 도형 유형이라도 이 단일 함수에 전달할 수 있습니다. 이것이 바로 다형성입니다: 하나의 함수가 실제 객체 유형에 따라 여러 가지 동작을 수행하는 것입니다.

main.c에서 호출할 수 있도록 shape.hprocess_shape를 선언하는 것을 잊지 마세요.

직접 해보기

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

int main() {
    // TODO: 도형 타입을 위한 문자 하나를 입력받습니다 ('c'는 circle, 'r'은 rectangle)
    // TODO: 'c'인 경우, radius를 읽고 Circle을 생성한 뒤, 해당 base로 process_shape를 호출합니다
    // TODO: 'r'인 경우, width와 height를 읽고 Rectangle을 생성한 뒤, 해당 base로 process_shape를 호출합니다
    return 0;
}

Object Oriented Programming의 모든 레슨