Menu
Coddy logo textTech

프로젝트 개요

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

challenge icon

챌린지

쉬움

함수 포인터를 통해 모든 도형이 수행할 수 있는 동작을 정의하는 인터페이스인 기본 Shape 구조체를 생성하여 Shape Drawer 프로젝트의 기초를 다져보겠습니다.

이 다형성 시스템을 설정하기 위해 두 개의 파일을 생성합니다:

  • shape.h: 여기서 핵심 인터페이스를 정의합니다. 먼저, Shape 구조체에 대한 전방 선언(forward declaration)을 작성하세요. 그런 다음 두 가지 함수 포인터 타입을 정의합니다:
    • DrawFuncconst Shape* 매개변수를 받고 아무것도 반환하지 않음
    • AreaFuncconst Shape* 매개변수를 받고 double을 반환함
    마지막으로, draw (DrawFunc 타입)와 area (AreaFunc 타입)라는 두 개의 함수 포인터를 포함하는 Shape 구조체 자체를 정의하세요. 이 구조체는 순수하게 인터페이스 역할을 하며, 도형 고유의 데이터는 가지지 않고 동작만 보유합니다.
  • main.c: 간단한 테스트용 도형을 만들어 인터페이스가 작동하는지 증명합니다. 다음 두 함수를 구현하세요:
    • test_drawDrawing test shape를 출력
    • test_area42.0을 반환
    Shape 인스턴스를 생성하고, 이를 테스트 함수들에 연결한 다음, 인터페이스를 통해 두 함수를 모두 호출하세요. 면적 결과는 소수점 첫째 자리까지 출력합니다.

출력 결과는 함수 포인터가 올바르게 작동함을 보여주어야 합니다:

Drawing test shape
Area: 42.0

왜 전방 선언을 사용하나요? 구조체가 완전히 정의되기 typedef struct Shape Shape;가 나타나는 이유가 궁금할 수 있습니다. 이는 DrawFuncAreaFunc가 매개변수 타입에서 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;
}

Object Oriented Programming의 모든 레슨