Menu
Coddy logo textTech

팩토리 패턴

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

Factory pattern은 객체 생성을 하나의 function으로 중앙 집중화합니다. 프로그램 전체에 malloc과 초기화 코드를 흩어 놓는 대신, 무엇을 생성할지 결정하고 바로 사용할 수 있는 객체를 반환하는 하나의 function을 호출합니다.

이 패턴은 다형성과 결합할 때 특히 강력합니다. factory는 공통 base 포인터를 통해 서로 다른 구체 타입을 반환하여 생성 세부 정보를 호출자에게 숨길 수 있습니다. 호출자는 그저 "도형 하나"를 요청하고, factory는 원, 직사각형 또는 다른 무언가를 생성할지 결정합니다.

일반적인 factory 구현은 다음과 같습니다:

typedef enum {
    SHAPE_CIRCLE,
    SHAPE_RECTANGLE
} ShapeType;

Shape* create_shape(ShapeType type) {
    switch (type) {
        case SHAPE_CIRCLE:
            return (Shape*)create_circle(5.0);
        case SHAPE_RECTANGLE:
            return (Shape*)create_rectangle(4.0, 3.0);
        default:
            return NULL;
    }
}

factory는 식별자(일반적으로 enum)를 받아 switch 문을 사용해 어떤 constructor를 호출할지 결정합니다. 실제로 생성된 유형과 관계없이 Shape*를 반환합니다. 호출자는 Circle이나 Rectangle에 대해 알 필요가 없습니다. 단지 기본 유형과 함께 작동합니다:

Shape* s = create_shape(SHAPE_CIRCLE);
s->draw(s);  // 다형성 호출
free_shape(s);

이 패턴을 사용하면 새로운 타입을 쉽게 추가할 수 있습니다. enum에 새 값을 추가하고 factory에 새 case를 추가하기만 하면 됩니다. 나머지 코드는 변경되지 않습니다.

challenge icon

챌린지

쉬움

Pet Factory를 만들어 봅시다. 하나의 factory function을 통해 다양한 유형의 반려동물을 생성하는 시스템입니다. 코드 전체에 생성 로직을 흩어 놓는 대신, 입력 식별자에 따라 어떤 반려동물을 생성할지 결정하는 한 곳에 이를 중앙화합니다.

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

  • pet.h: PET_DOG, PET_CAT, PET_BIRD 값을 갖는 PetType enum을 Define합니다. speak을 위한 함수 포인터(const Pet*를 받고 아무것도 반환하지 않음)를 포함하는 기본 Pet struct를 Create합니다. PetType을 받고 Pet*을 반환하는 factory function create_pet과 cleanup을 위한 free_pet function을 Declare합니다.
  • pet.c: 각각 Pet을 첫 번째 member로 포함하는 세 가지 구체적인 반려동물 struct인 Dog, Cat, Bird를 Define합니다. 각 유형에 대한 speak function을 Implement합니다.
    • Dogs는 Woof!를 출력합니다.
    • Cats는 Meow!를 출력합니다.
    • Birds는 Tweet!를 출력합니다.
    각 반려동물 유형에 대해 memory를 Allocate하고 appropriate speak function을 연결하는 constructor function을 Create합니다. 그런 다음 create_pet factory를 Implement합니다. PetType에 대해 switch statement를 사용하여 correct constructor를 Call하고 그 결과를 Pet*으로 반환합니다. invalid 유형인 경우 NULL을 반환합니다. Allocate된 memory를 해제하도록 free_pet을 Implement합니다.
  • main.c: 반려동물 유형을 나타내는 정수(개는 0, 고양이는 1, 새는 2)를 읽습니다. factory를 사용하여 appropriate 반려동물을 Create하고, 기본 Pet* pointer를 통해 해당 반려동물의 speak function을 polymorphically Call한 다음 반려동물을 Free합니다.

프로그램은 생성할 반려동물을 나타내는 정수 하나를 입력으로 받습니다.

입력이 0일 때의 예시 출력:

Woof!

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

Meow!

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

Tweet!

Factory 패턴의 장점은 main.cDog, Cat, Bird struct에 대해 알 필요가 없다는 것입니다. Pet 기본 유형만 사용합니다. 나중에 새로운 반려동물 유형을 추가할 때는 새로운 enum 값과 factory의 새로운 case를 추가하면 되며, 반려동물을 사용하는 코드는 변경할 필요가 없습니다.

직접 해보기

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

int main(void) {
    int type;
    scanf("%d", &type);
    
    // TODO: 팩토리를 사용하여 적절한 pet을 생성하세요
    // Hint: int를 PetType으로 캐스팅하세요
    
    // TODO: Pet* 포인터를 통해 다형적으로 speak 함수를 호출하세요
    
    // TODO: pet을 해제하세요
    
    return 0;
}
quiz icon실력 점검

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

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

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