Menu
Coddy logo textTech

메서드 시뮬레이션

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

함수 포인터를 구조체 안에 배치하는 방법을 살펴보았습니다. 진정한 강력함은 같은 구조체 유형의 서로 다른 인스턴스에 서로 다른 함수를 할당할 때 발휘됩니다. 이렇게 하면 동작이 달라지는 메서드를 시뮬레이션할 수 있습니다.

사용자 지정 로직을 사용하는 action을 나타내는 구조체를 생각해 보세요:

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;
}

greetfarewell은 둘 다 동일한 타입(Action)이지만, 각각에 대해 execute를 호출하면 완전히 다른 결과가 생성됩니다. 이 구조체는 단순히 데이터를 담고 있는 것이 아닙니다. 인스턴스마다 달라지는 동작을 담고 있습니다.

이 패턴은 다른 언어에서 객체가 작동하는 방식을 반영합니다. 각 객체는 동일한 인터페이스를 공유하더라도 메서드에 대한 고유한 구현을 가질 수 있습니다.

challenge icon

챌린지

쉬움

Speaker 시스템을 만들어, 동일한 구조체 유형의 서로 다른 인스턴스들이 어떤 함수가 연결되어 있는지에 따라 완전히 다른 동작을 보일 수 있음을 알아봅시다.

코드를 구성하기 위해 두 개의 파일을 만듭니다:

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

프로그램은 두 개의 입력을 받습니다. 첫 번째 입력은 첫 번째 speaker 유형(bark는 1, meow는 2, chirp는 3)이고, 두 번째 입력은 두 번째 speaker 유형(역시 1, 2 또는 3)입니다.

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

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

Woof!
Meow!

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

Chirp!
Chirp!

여기서 핵심은 두 speaker가 모두 동일한 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 컴파일러