프로젝트 개요
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 44번째.
챌린지
쉬움함수 포인터를 통해 모든 도형이 수행할 수 있는 동작을 정의하는 인터페이스인 기본 Shape 구조체를 생성하여 Shape Drawer 프로젝트의 기초를 다져보겠습니다.
이 다형성 시스템을 설정하기 위해 두 개의 파일을 생성합니다:
shape.h: 여기서 핵심 인터페이스를 정의합니다. 먼저,Shape구조체에 대한 전방 선언(forward declaration)을 작성하세요. 그런 다음 두 가지 함수 포인터 타입을 정의합니다:DrawFunc—const Shape*매개변수를 받고 아무것도 반환하지 않음AreaFunc—const Shape*매개변수를 받고double을 반환함
draw(DrawFunc타입)와area(AreaFunc타입)라는 두 개의 함수 포인터를 포함하는Shape구조체 자체를 정의하세요. 이 구조체는 순수하게 인터페이스 역할을 하며, 도형 고유의 데이터는 가지지 않고 동작만 보유합니다.main.c: 간단한 테스트용 도형을 만들어 인터페이스가 작동하는지 증명합니다. 다음 두 함수를 구현하세요:test_draw—Drawing test shape를 출력test_area—42.0을 반환
Shape인스턴스를 생성하고, 이를 테스트 함수들에 연결한 다음, 인터페이스를 통해 두 함수를 모두 호출하세요. 면적 결과는 소수점 첫째 자리까지 출력합니다.
출력 결과는 함수 포인터가 올바르게 작동함을 보여주어야 합니다:
Drawing test shape
Area: 42.0왜 전방 선언을 사용하나요? 구조체가 완전히 정의되기 전에 typedef struct Shape Shape;가 나타나는 이유가 궁금할 수 있습니다. 이는 DrawFunc와 AreaFunc가 매개변수 타입에서 const Shape*를 참조하기 때문입니다. 하지만 파일의 해당 시점에서 컴파일러는 아직 전체 구조체 정의를 보지 못한 상태입니다. 전방 선언은 컴파일러에게 "Shape라는 이름의 구조체가 존재한다"라고 알려주며, 이는 해당 구조체에 대한 포인터를 사용하기에 충분합니다. 전체 정의는 나중에 뒤따릅니다. 이 패턴은 C 언어에서 구조체가 (직접적으로든 함수 포인터를 통해서든) 자기 자신을 참조해야 할 때 흔히 사용됩니다.
여기서 핵심 통찰은 Shape가 원이나 사각형에 대해 전혀 모른다는 것입니다. 단지 모든 도형은 스스로를 draw할 수 있어야 하고 area를 계산할 수 있어야 한다는 것만 알고 있습니다. 다음 강의에서는 이 기본 구조체를 포함하고 자체적인 구현을 제공하는 구체적인 도형들을 만들 것입니다. 헤더 파일에 인클루드 가드(include guards)를 사용하는 것을 잊지 마세요.
직접 해보기
#include <stdio.h>
#include "shape.h"
// TODO: test_draw 함수 구현
// - const Shape* 매개변수를 받음
// - "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;
}