이벤트 시스템
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 61번째.
챌린지
쉬움Notification System을 만들어 봅시다. 여러 handler가 하나의 event를 구독하고 event가 발생할 때 응답할 수 있는 이벤트 기반 아키텍처입니다. 이 패턴은 반응형 프로그래밍과 GUI 프레임워크의 핵심입니다.
코드를 세 개의 파일로 구성합니다.
event.h:const char*message를 받는Handler함수 포인터 유형을 정의합니다. 최대 5개의 handlers 배열과 등록된 handlers의 count를 보유하는Event구조체를 생성합니다. event를 초기화하고, handler를 구독하고, 모든 구독자에게 알리도록 event를 발생시키는 함수들을 선언합니다.event.c: event system을 구현합니다.init_event: Event 포인터를 받아 handler count를 0으로 설정합니다.subscribe: Event 포인터와 Handler를 받아 공간이 있으면(count가 5보다 작으면) handler를 배열에 추가하고 count를 증가시킵니다.fire: Event 포인터와 message 문자열을 받아, 구독된 순서대로 각 registered handler를 해당 message와 함께 호출합니다.
main.c: event에 고유한 방식으로 응답하는 세 개의 서로 다른 handler 함수를 생성합니다.logger: message 뒤에[LOG]를 출력합니다.alert: message 뒤에[ALERT]를 출력합니다.counter: 호출된 횟수를 세기 위해 static 변수를 사용한 다음, 현재 count를 X로 하여[COUNT] X를 출력합니다.
프로그램은 다음을 입력으로 받습니다.
- 구독할 handlers의 수(1, 2 또는 3)
- 브로드캐스트할 message
입력이 3과 System started일 때의 출력 예시:
[LOG] System started
[ALERT] System started
[COUNT] 1입력이 2와 Warning detected일 때의 출력 예시:
[LOG] Warning detected
[ALERT] Warning detected입력이 1과 Hello일 때의 출력 예시:
[LOG] Hello이 예제는 함수 포인터를 통한 다형성을 보여 줍니다. 동일한 fire 호출이 어떤 handlers가 구독되어 있는지에 따라 완전히 다른 동작을 실행합니다. 각 handler는 동일한 event에 고유한 방식으로 응답하며, 이벤트 기반 설계의 결합도가 낮은 특성을 보여 줍니다.
직접 해보기
#include <stdio.h>
#include <string.h>
#include "event.h"
// TODO: logger 핸들러 구현
// "[LOG] " 뒤에 메시지를 출력합니다
void logger(const char* message) {
// TODO: 구현
}
// TODO: alert 핸들러 구현
// "[ALERT] " 뒤에 메시지를 출력합니다
void alert(const char* message) {
// TODO: 구현
}
// TODO: counter 핸들러 구현
// 호출 횟수를 세기 위해 static 변수를 사용합니다
// 현재 카운트인 X와 함께 "[COUNT] X"를 출력합니다
void counter(const char* message) {
// TODO: static 변수로 구현
}
int main() {
// 구독할 핸들러 수를 읽습니다
int num_handlers;
scanf("%d", &num_handlers);
getchar(); // 개행 문자 소비
// 메시지를 읽습니다
char message[256];
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = '\0'; // 줄바꿈 제거
// TODO: Event 생성 및 초기화
// TODO: num_handlers에 따라 핸들러 구독
// 핸들러 1개: logger
// 핸들러 2개: logger, alert
// 핸들러 3개: logger, alert, counter
// TODO: 메시지로 이벤트 발생
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러