Menu
Coddy logo textTech

요약: Logger Factory

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

challenge icon

챌린지

쉬움

Logger Factory를 만들어 봅시다. 이는 Factory 패턴과 다형성을 결합하는 강력한 기능을 보여 주는 시스템입니다. 이 factory는 configuration flag에 따라 서로 다른 logger 구현을 생성하므로, logger를 사용하는 방식을 변경하지 않고도 자세한 console 출력과 조용한 "dummy" logging 사이를 전환할 수 있습니다.

코드를 세 개의 파일로 구성합니다.

  • logger.h: interface 역할을 하는 Logger struct를 Define합니다. Logger*const char* message를 받는 log용 function pointer를 포함해야 합니다. integer flag(콘솔의 경우 1, dummy의 경우 0)를 받아 Logger*를 반환하는 factory function create_logger를 선언합니다. 또한 정리를 위한 free_logger function도 선언합니다.
  • logger.c: 두 가지 구체적인 logger type을 Implement합니다. ConsoleLogger는 첫 번째 member로 Logger를 embeds하며, [LOG] message 형식으로 message를 출력하는 log function을 가집니다. DummyLoggerLogger를 embeds하지만 해당 log function은 아무 작업도 하지 않습니다. 출력하지 않고 단순히 반환합니다. 각 type에 대한 Constructor function을 만들어 memory를 Allocate하고 appropriate log function을 연결합니다. 그런 다음 flag를 확인하고 appropriate logger type을 Logger*로 반환하는 factory로 create_logger를 Implement합니다. memory를 해제하도록 free_logger를 Implement합니다.
  • main.c: 생성할 logger를 결정하기 위해 integer(1 또는 0)를 읽습니다. factory를 사용해 appropriate logger를 create한 다음, 두 message인 "Starting application""Shutting down"을 사용해 해당 logger의 log function을 Call합니다. 마지막으로 logger를 Free합니다.

프로그램은 logger type을 나타내는 하나의 input을 받습니다(콘솔의 경우 1, dummy의 경우 0).

input이 1일 때의 예시 output:

[LOG] Starting application
[LOG] Shutting down

input이 0일 때의 예시 output:

(output 없음: dummy logger는 모든 message를 조용히 무시합니다.)

여기서 우아한 점은 어떤 type을 받는지와 관계없이 main.c가 logger를 동일한 방식으로 사용한다는 것입니다. 무엇을 create할지는 factory가 결정하고, 다형성은 올바른 동작이 실행되도록 보장합니다. 이 패턴은 개발 중에는 자세한 logging을 사용하고 production에서는 조용히 작동하도록 할 수 있는 실제 application에서 매우 유용합니다.

직접 해보기

#include <stdio.h>
#include "logger.h"

int main() {
    // 로거 타입 플래그를 읽습니다 (1은 콘솔, 0은 더미)
    int flag;
    scanf("%d", &flag);
    
    // TODO: 팩토리를 사용하여 적절한 로거를 생성합니다
    
    // TODO: Call the logger's log function with "Starting application"
    
    // TODO: Call the logger's log function with "Shutting down"
    
    // TODO: 로거를 해제합니다
    
    return 0;
}

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

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