프로젝트 개요
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 44번째.
챌린지
쉬움함수 포인터를 통해 모든 도형이 수행할 수 있는 작업을 정의하는 인터페이스인 기본 Shape struct를 만들어 Shape Drawer 프로젝트의 기반을 마련해 보겠습니다.
이 다형성 시스템을 설정하기 위해 두 개의 파일을 만듭니다.
shape.h: 여기에서 핵심 인터페이스를 정의합니다. 먼저Shapestruct의 전방 선언을 만듭니다. 그런 다음 두 가지 함수 포인터 타입을 정의합니다.DrawFunc:const Shape*parameter를 받고 아무것도 반환하지 않습니다AreaFunc:const Shape*parameter를 받고double을 반환합니다
Shapestruct 자체를 정의합니다. 즉,DrawFunc타입의draw와AreaFunc타입의area입니다. 이 struct는 순수하게 인터페이스 역할을 합니다. 도형별 데이터는 보유하지 않고 동작만 보유합니다.main.c: 간단한 test shape를 만들어 인터페이스가 작동한다는 것을 보여 줍니다. 두 함수를 Implement합니다.test_draw:Drawing test shape를 출력합니다test_area:42.0을 반환합니다
Shapeinstance를 만들고 이를 이러한 test functions에 연결한 다음, 인터페이스를 통해 두 함수를 모두 Call합니다. area 결과는 소수점 한 자리로 출력합니다.
출력 결과는 function pointers가 올바르게 작동한다는 것을 보여 줘야 합니다.
Drawing test shape
Area: 42.0왜 전방 선언을 사용할까요? typedef struct Shape Shape;가 struct가 완전히 정의되기 전에 나타나는 이유가 궁금할 수 있습니다. 이는 DrawFunc와 AreaFunc가 parameter types에서 const Shape*를 참조하기 때문에 필요합니다. 하지만 파일의 해당 시점에는 compiler가 아직 전체 struct definition을 확인하지 못했습니다. 전방 선언은 compiler에게 "a struct named Shape exists"라고 알려 주며, 이것만으로도 해당 struct에 대한 pointer를 사용할 수 있습니다. 전체 definition은 나중에 이어집니다. 이 패턴은 struct가 자기 자신을 직접 또는 function pointers를 통해 참조해야 할 때 C에서 흔히 사용됩니다.
여기서 핵심은 Shape가 circles나 rectangles에 대해 아무것도 모른다는 것입니다. Shape는 모든 shape가 자신을 draw하고 자신의 area를 계산할 수 있어야 한다는 것만 알고 있습니다. 다음 lessons에서는 이 base struct를 포함하고 자체 Implementations를 제공하는 concrete shapes를 만들게 됩니다. header file에서 include guards를 사용하는 것을 잊지 마세요.
직접 해보기
#include <stdio.h>
#include "shape.h"
// TODO: test_draw 함수 구현
// - const Shape* 매개변수를 받음
// - Prints "Drawing test shape"
void test_draw(const Shape* shape) {
// TODO: 필요한 메시지 출력
}
// TODO: test_area 함수 구현
// - const Shape* 매개변수를 받음
// - 42.0을 반환
double test_area(const Shape* shape) {
// TODO: 테스트 면적 값 반환
}
int main() {
// TODO: Shape 인스턴스 생성
// TODO: shape를 test_draw와 test_area 함수에 연결
// TODO: 인터페이스를 통해 draw 호출
// TODO: 인터페이스를 통해 area를 호출하고 소수점 한 자리로 출력
// 형식: "Area: %.1f\n"
return 0;
}
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러