Menu
Coddy logo textTech

프로젝트 개요

Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 44번째.

challenge icon

챌린지

쉬움

함수 포인터를 통해 모든 도형이 수행할 수 있는 작업을 정의하는 인터페이스인 기본 Shape struct를 만들어 Shape Drawer 프로젝트의 기반을 마련해 보겠습니다.

이 다형성 시스템을 설정하기 위해 두 개의 파일을 만듭니다.

  • shape.h: 여기에서 핵심 인터페이스를 정의합니다. 먼저 Shape struct의 전방 선언을 만듭니다. 그런 다음 두 가지 함수 포인터 타입을 정의합니다.
    • DrawFunc: const Shape* parameter를 받고 아무것도 반환하지 않습니다
    • AreaFunc: const Shape* parameter를 받고 double을 반환합니다
    마지막으로 두 개의 함수 포인터를 포함하는 Shape struct 자체를 정의합니다. 즉, DrawFunc 타입의 drawAreaFunc 타입의 area입니다. 이 struct는 순수하게 인터페이스 역할을 합니다. 도형별 데이터는 보유하지 않고 동작만 보유합니다.
  • main.c: 간단한 test shape를 만들어 인터페이스가 작동한다는 것을 보여 줍니다. 두 함수를 Implement합니다.
    • test_draw: Drawing test shape를 출력합니다
    • test_area: 42.0을 반환합니다
    Shape instance를 만들고 이를 이러한 test functions에 연결한 다음, 인터페이스를 통해 두 함수를 모두 Call합니다. area 결과는 소수점 한 자리로 출력합니다.

출력 결과는 function pointers가 올바르게 작동한다는 것을 보여 줘야 합니다.

Drawing test shape
Area: 42.0

왜 전방 선언을 사용할까요? typedef struct Shape Shape;가 struct가 완전히 정의되기 전에 나타나는 이유가 궁금할 수 있습니다. 이는 DrawFuncAreaFunc가 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 컴파일러