Menu
CoddyTech

요약: 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을 가집니다. DummyLogger도 Logger를 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 컴파일러