Menu
Coddy logo textTech

이벤트 시스템

Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 61번째.

challenge icon

챌린지

쉬움

여러 핸들러가 이벤트에 구독하고 이벤트가 발생할 때 응답할 수 있는 이벤트 기반 아키텍처인 알림 시스템(Notification System)을 구축해 보겠습니다. 이 패턴은 반응형 프로그래밍과 GUI 프레임워크의 근간이 됩니다.

코드는 다음 세 개의 파일로 구성됩니다:

  • event.h: const char* 메시지를 인자로 받는 Handler 함수 포인터 타입을 정의합니다. 최대 5개의 핸들러를 저장할 수 있는 배열과 등록된 핸들러의 개수를 포함하는 Event 구조체를 생성합니다. 이벤트를 초기화하고, 핸들러를 구독하며, 모든 구독자에게 알림을 보내기 위해 이벤트를 발생시키는 함수들을 선언합니다.
  • event.c: 이벤트 시스템을 구현합니다:
    • init_event — Event 포인터를 받아 핸들러 개수를 0으로 설정합니다.
    • subscribe — Event 포인터와 Handler를 받아, 공간이 있는 경우(개수가 5 미만) 배열에 핸들러를 추가하고 개수를 증가시킵니다.
    • fire — Event 포인터와 메시지 문자열을 받아, 등록된 각 핸들러를 구독된 순서대로 해당 메시지와 함께 호출합니다.
  • main.c: 이벤트에 고유한 방식으로 응답하는 세 가지 핸들러 함수를 생성합니다:
    • logger[LOG] 뒤에 메시지를 출력합니다.
    • alert[ALERT] 뒤에 메시지를 출력합니다.
    • counter — 정적 변수를 사용하여 호출된 횟수를 세고, [COUNT] X를 출력합니다 (X는 현재 횟수).
    구독할 핸들러의 개수(1, 2 또는 3)를 나타내는 정수를 입력받습니다. 해당 개수만큼 순서대로 핸들러를 구독합니다: 첫 번째는 logger, 두 번째는 alert(2개 이상인 경우), 세 번째는 counter(3개인 경우)입니다. 메시지 문자열을 입력받은 후, 해당 메시지로 이벤트를 발생시킵니다.

프로그램은 다음을 입력받습니다:

  1. 구독할 핸들러의 개수 (1, 2, 또는 3)
  2. 방송할 메시지

입력값이 3System started일 때의 출력 예시:

[LOG] System started
[ALERT] System started
[COUNT] 1

입력값이 2Warning detected일 때의 출력 예시:

[LOG] Warning detected
[ALERT] Warning detected

입력값이 1Hello일 때의 출력 예시:

[LOG] Hello

이것은 함수 포인터를 통한 다형성을 보여줍니다. 동일한 fire 호출이 어떤 핸들러가 구독되었는지에 따라 완전히 다른 동작을 유발합니다. 각 핸들러는 동일한 이벤트에 대해 자신만의 방식으로 응답하며, 이는 이벤트 기반 설계의 결합도가 낮은(decoupled) 특성을 잘 보여줍니다.

직접 해보기

#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 변수를 사용하여 호출 횟수를 계산합니다
// "[COUNT] X"를 출력하며, 여기서 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: message와 함께 이벤트 발생(fire)
    
    return 0;
}
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨