요약: Logger Factory
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 57번째.
챌린지
쉬움팩토리 패턴과 다형성의 강력한 조합을 보여주는 시스템인 Logger Factory를 만들어 보겠습니다. 여러분의 팩토리는 설정 플래그에 따라 서로 다른 로거 구현체를 생성하여, 로거 사용 방식을 변경하지 않고도 상세한 콘솔 출력과 자동 "더미(dummy)" 로깅 사이를 전환할 수 있게 해줍니다.
코드는 다음 세 개의 파일로 구성됩니다:
logger.h: 인터페이스 역할을 하는Logger구조체를 정의합니다. 이 구조체는Logger*와const char*메시지를 인자로 받는log함수 포인터를 포함해야 합니다. 정수 플래그(콘솔의 경우 1, 더미의 경우 0)를 받아Logger*를 반환하는 팩토리 함수create_logger를 선언하세요. 또한 메모리 정리를 위한free_logger함수도 선언하세요.logger.c: 두 가지 구체적인 로거 타입을 구현합니다.ConsoleLogger는Logger를 첫 번째 멤버로 포함하며,[LOG] message형식으로 메시지를 출력하는 로그 함수를 가집니다.DummyLogger또한Logger를 포함하지만, 로그 함수는 아무 작업도 수행하지 않고 출력 없이 단순히 반환합니다. 각 타입에 대해 메모리를 할당하고 적절한 로그 함수를 연결하는 생성자 함수를 만드세요. 그런 다음 플래그를 확인하여 적절한 로거 타입을Logger*로 반환하는 팩토리 함수create_logger를 구현하세요. 메모리를 해제하는free_logger도 구현하세요.main.c: 생성할 로거를 결정하기 위해 정수(1 또는 0)를 읽습니다. 팩토리를 사용하여 적절한 로거를 생성한 다음,"Starting application"과"Shutting down"이라는 두 메시지로log함수를 호출하세요. 마지막으로 로거를 해제합니다.
프로그램은 로거 타입을 나타내는 정수(콘솔의 경우 1, 더미의 경우 0) 하나를 입력받습니다.
입력이 1일 때의 출력 예시:
[LOG] Starting application
[LOG] Shutting down입력이 0일 때의 출력 예시:
(출력 없음 — 더미 로거는 모든 메시지를 자동으로 무시합니다)
이 방식의 우아함은 main.c가 어떤 타입의 로거를 받든 동일하게 사용한다는 점에 있습니다. 팩토리가 무엇을 생성할지 결정하고, 다형성이 올바른 동작이 실행되도록 보장합니다. 이 패턴은 개발 중에는 상세한 로깅을 원하지만 프로덕션 환경에서는 조용한 작동을 원하는 실제 애플리케이션에서 매우 유용합니다.
직접 해보기
#include <stdio.h>
#include "logger.h"
int main() {
// logger 타입 플래그를 읽습니다 (1은 console용, 0은 dummy용)
int flag;
scanf("%d", &flag);
// TODO: factory를 사용하여 적절한 logger를 생성하세요
// TODO: "Starting application"과 함께 logger의 log 함수를 호출하세요
// TODO: "Shutting down"과 함께 logger의 log 함수를 호출하세요
// TODO: logger를 해제하세요
return 0;
}