Menu
CoddyTech

메서드 시뮬레이션

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

구조체 안에 함수 포인터를 넣는 방법을 살펴봤습니다. 같은 구조체 유형의 각 인스턴스에 서로 다른 함수를 할당할 때 진정한 힘이 발휘됩니다. 이렇게 하면 동작이 다양한 메서드를 시뮬레이션할 수 있습니다.

사용자 지정 가능한 로직이 포함된 동작을 나타내는 구조체를 살펴보세요.

typedef void (*ActionFunc)(void);

typedef struct {
    const char* name;
    ActionFunc execute;
} Action;

인스턴스를 만들 때 각 인스턴스에 서로 다른 함수를 연결합니다:

void say_hello(void) {
    printf("Hello!\n");
}

void say_goodbye(void) {
    printf("Goodbye!\n");
}

int main() {
    Action greet = { "Greet", say_hello };
    Action farewell = { "Farewell", say_goodbye };
    
    greet.execute();    // 출력: Hello!
    farewell.execute(); // 출력: Goodbye!
    return 0;
}

greet와 farewell은 같은 유형(Action)이지만, 각각에 execute를 호출하면 완전히 다른 결과가 나옵니다. 이 구조체는 단순히 데이터를 담는 것이 아닙니다. 인스턴스마다 달라지는 동작을 담고 있습니다.

이 패턴은 다른 언어에서 객체가 작동하는 방식을 반영합니다. 객체마다 같은 인터페이스를 공유하면서도 메서드를 각자 구현할 수 있습니다.

challenge icon

챌린지

쉬움

서로 다른 함수가 연결되었는지에 따라 같은 구조체 유형의 각 인스턴스가 완전히 다른 동작을 보일 수 있음을 보여 주는 Speaker 시스템을 만들어 봅시다.

코드를 정리하기 위해 두 개의 파일을 만듭니다.

  • speaker.h: 매개변수를 받지 않고 아무것도 반환하지 않는 SpeakFunc라는 함수 포인터 유형을 정의합니다. 그런 다음 name(const char*)과 SpeakFunc 유형의 speak 함수 포인터를 포함하는 Speaker 구조체를 정의합니다.
  • main.c: 헤더를 포함하고 서로 다른 세 가지 말하기 함수를 구현합니다.
    • bark: Woof!를 출력합니다.
    • meow: Meow!를 출력합니다.
    • chirp: Chirp!를 출력합니다.
    그런 다음 입력에 따라 서로 다른 함수가 연결된 Speaker 인스턴스 두 개를 만들고, 각 인스턴스의 speak 메서드를 호출하여 다형성이 작동하는 모습을 확인합니다.

프로그램은 입력 두 개를 받습니다. 첫 번째는 첫 번째 스피커 유형(bark는 1, meow는 2, chirp는 3)이고, 두 번째는 두 번째 스피커 유형(역시 1, 2, 3 중 하나)입니다.

Speaker 인스턴스 두 개를 만듭니다. 원하는 이름을 지정할 수 있습니다(예: "Dog", "Cat", "Bird" 또는 간단히 "Speaker1", "Speaker2"). 각 인스턴스의 입력 코드에 따라 적절한 함수를 연결한 다음, 순서대로 각 인스턴스의 speak를 호출합니다.

첫 번째 유형이 1이고 두 번째 유형이 2일 때의 출력 예시:

Woof!
Meow!

첫 번째 유형이 3이고 두 번째 유형이 3일 때의 출력 예시:

Chirp!
Chirp!

여기서 핵심은 두 스피커가 모두 같은 Speaker 유형이지만, 각각의 speak 멤버에 서로 다른 함수가 할당되어 서로 다른 출력을 만든다는 점입니다. 헤더 파일에 인클루드 가드를 사용하는 것을 잊지 마세요.

직접 해보기

#include <stdio.h>
#include "speaker.h"

// TODO: "Woof!"를 출력하는 bark 함수를 구현하세요

// TODO: "Meow!"를 출력하는 meow 함수를 구현하세요

// TODO: "Chirp!"를 출력하는 chirp 함수를 구현하세요

int main() {
    int type1, type2;
    scanf("%d", &type1);
    scanf("%d", &type2);
    
    // TODO: Speaker 인스턴스 두 개를 생성하세요
    
    // TODO: type1에 따라 첫 번째 speaker의 speak 함수를 연결하세요
    // (1 = bark, 2 = meow, 3 = chirp)
    
    // TODO: type2에 따라 두 번째 speaker의 speak 함수를 연결하세요
    // (1 = bark, 2 = meow, 3 = chirp)
    
    // TODO: 각 speaker의 speak를 순서대로 호출하세요
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C 컴파일러