다형성 활용
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 47번째.
챌린지
쉬움기본 Shape* 포인터를 통해 Circle이든 Rectangle이든 any shape를 처리할 수 있는 function을 작성하여 다형성이 실제로 작동한다는 것을 증명해 봅시다.
기존 Circle 및 Rectangle 구현을 기반으로, 모든 shape type을 동일한 방식으로 처리하는 단일 function이라는 강력한 추상화를 추가합니다.
프로젝트에는 다음 파일이 포함됩니다:
shape.h:DrawFunc및AreaFunctype을 포함하는 기본Shape인터페이스입니다.circle.h및circle.c: 이전 레슨에서 작성한 Circle 구현입니다.rectangle.h및rectangle.c: 이전 레슨에서 작성한 Rectangle 구현입니다.shape.c:Shape*pointer를 받는process_shape라는 새로운 function을 구현합니다. 이 function은 shape의drawfunction을 호출한 다음, 해당areafunction을 호출하고 결과를 소수점 이하 2자리 형식인Area: X.XX로 출력해야 합니다.main.c: 다형성이 실제로 작동하는 모습을 보여 줍니다. shape type 표시자(c는 원,r은 직사각형)를 필요한 치수와 함께 읽습니다. 적절한 shape를 생성한 다음, 내장된Shapemember에 대한 pointer를process_shape에 전달합니다. 동일한 function이 두 type을 모두 처리합니다!
프로그램에는 다음 중 하나가 입력됩니다:
- radius 값이 뒤따르는
c, 또는 - width 및 height 값이 뒤따르는
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 member를 Shape*로 캐스팅하면 모든 shape type을 이 단일 function에 전달할 수 있습니다. 이것이 다형성입니다. 하나의 function이 실제 객체 type에 따라 여러 동작을 수행하는 것입니다.
process_shape를 main.c에서 호출할 수 있도록 shape.h에 선언하는 것을 잊지 마세요.
직접 해보기
#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: 도형 유형을 위한 문자를 읽기 ('c'는 원, 'r'은 사각형)
// TODO: 'c'인 경우, 반지름을 읽고 Circle을 생성한 다음 그 base로 process_shape를 호출
// TODO: 'r'인 경우, 너비와 높이를 읽고 Rectangle을 생성한 다음 그 base로 process_shape를 호출
return 0;
}
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러