메서드 시뮬레이션
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를 호출하면 완전히 다른 결과가 나옵니다. 이 구조체는 단순히 데이터를 담는 것이 아닙니다. 인스턴스마다 달라지는 동작을 담고 있습니다.
이 패턴은 다른 언어에서 객체가 작동하는 방식을 반영합니다. 객체마다 같은 인터페이스를 공유하면서도 메서드를 각자 구현할 수 있습니다.
챌린지
쉬움서로 다른 함수가 연결되었는지에 따라 같은 구조체 유형의 각 인스턴스가 완전히 다른 동작을 보일 수 있음을 보여 주는 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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러