다형성 활용
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 47번째.
챌린지
쉬움기본 Shape* 포인터를 통해 원이든 사각형이든 어떤 도형이라도 처리할 수 있는 함수를 작성하여 다형성이 실제로 어떻게 작동하는지 증명해 봅시다.
기존의 Circle 및 Rectangle 구현을 바탕으로, 모든 도형 유형을 균일하게 다루는 강력한 추상화인 단일 함수를 추가하게 됩니다.
프로젝트에는 다음 파일들이 포함됩니다:
shape.h:DrawFunc및AreaFunc타입을 포함하는 기본Shape인터페이스입니다.circle.h및circle.c: 이전 레슨에서 구현한 Circle 구현체입니다.rectangle.h및rectangle.c: 이전 레슨에서 구현한 Rectangle 구현체입니다.shape.c:Shape*포인터를 인자로 받는process_shape라는 새로운 함수를 구현합니다. 이 함수는 도형의draw함수를 호출한 다음,area함수를 호출하고 그 결과를 소수점 둘째 자리까지Area: X.XX형식으로 출력해야 합니다.main.c: 다형성이 실제로 작동하는 모습을 보여줍니다. 도형 유형 식별자(원인 경우c, 사각형인 경우r)와 필요한 치수를 읽습니다. 적절한 도형을 생성한 다음, 해당 도형에 내장된Shape멤버의 포인터를process_shape에 전달합니다. 동일한 함수가 두 유형을 모두 처리합니다!
프로그램은 다음 중 하나를 입력받습니다:
c와 그 뒤에 오는 반지름 값, 또는r과 그 뒤에 오는 너비 및 높이 값
입력이 c와 5.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.h에 process_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;
}