Menu
Coddy logo textTech

이벤트 시스템

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

challenge icon

챌린지

쉬움

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)를 나타내는 정수를 읽습니다. 해당 수만큼의 handlers를 순서대로 구독합니다. 먼저 logger를 구독하고, 그다음 2 이상이면 alert를, 3이면 counter를 구독합니다. message 문자열을 읽은 다음 해당 message와 함께 event를 발생시킵니다.

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

  1. 구독할 handlers의 수(1, 2 또는 3)
  2. 브로드캐스트할 message

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

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

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

[LOG] Warning detected
[ALERT] Warning detected

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

[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;
}
quiz icon실력 점검

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

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

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