Menu
Coddy logo textTech

생성자 패턴

Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 12번째.

Java나 C++와 같은 언어에서는 생성자(메모리를 자동으로 할당하고 필드를 초기화하는 특수한 함수)를 사용하여 객체를 생성합니다. C에는 이러한 기능이 없지만, create_ 함수라는 간단한 패턴을 사용하여 이를 흉내 낼 수 있습니다.

C에서 생성자 함수는 일반적으로 세 가지 작업을 수행합니다: malloc을 사용하여 메모리를 할당하고, 모든 필드를 적절한 값으로 초기화하며, 새 객체에 대한 포인터를 반환합니다:

typedef struct {
    char *name;
    int age;
} Person;

Person *create_person(const char *name, int age) {
    Person *p = malloc(sizeof(Person));
    p->name = malloc(strlen(name) + 1);
    strcpy(p->name, name);
    p->age = age;
    return p;
}

함수는 객체가 스택이 아닌 힙에 존재하기 때문에 포인터를 반환합니다. 이는 함수가 반환된 후에도 객체가 유지되며 자유롭게 전달될 수 있음을 의미합니다. 호출자는 다음과 같이 사용합니다:

Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);

생성자가 구조체 할당, 문자열 공간 할당, 데이터 복사 등 모든 복잡한 세부 사항을 어떻게 처리하는지 주목해 보세요. 호출자는 초기값만 제공하고 바로 사용할 수 있는 객체를 받게 됩니다. 이는 생성 로직을 한 곳에 캡슐화하여 코드를 더 깔끔하게 만들고 오류 발생 가능성을 줄여줍니다.

challenge icon

챌린지

쉬움

힙(heap)에 도서 객체를 생성하기 위해 생성자 패턴을 사용하는 Book 모듈을 만들어 보겠습니다. 모든 메모리 할당과 초기화를 처리하고 바로 사용할 수 있는 포인터를 반환하는 create_ 함수를 작성하는 연습을 하게 됩니다.

세 개의 파일을 생성해야 합니다:

  • book.h: 두 개의 멤버를 가진 Book 구조체를 선언하세요: char *title (동적으로 할당된 문자열에 대한 포인터)과 int pages. 또한 제목 문자열과 페이지 수를 인자로 받아 새로 생성된 Book에 대한 포인터를 반환하는 생성자 함수 create_book을 선언하세요. BOOK_H 심볼을 사용하여 include guard를 적용하세요.
  • book.c: create_book 함수를 구현하세요. 생성자는 Book 구조체 자체를 위한 메모리를 할당한 다음, 제목 문자열을 위한 별도의 메모리를 할당하고(널 종료 문자를 고려해야 함을 잊지 마세요), 제목을 새 메모리에 복사하고, pages 필드를 설정한 후 새 Book에 대한 포인터를 반환해야 합니다.
  • main.c: 생성자를 사용하여 도서를 생성하고 해당 정보를 표시하세요.

두 개의 입력을 받게 됩니다: 도서 제목 (문자열)과 페이지 수 (정수).

메인 파일에서 create_book을 사용하여 제공된 값으로 새 도서를 생성한 다음, 다음 형식으로 정보를 출력하세요:

Title: {title}
Pages: {pages}

예를 들어, 입력값이 The C Programming Language272인 경우 출력은 다음과 같습니다:

Title: The C Programming Language
Pages: 272

생성자가 모든 생성 로직을 캡슐화한다는 점을 기억하세요. 호출자는 단순히 초기값을 제공하고 바로 사용할 수 있도록 완전히 초기화된 객체를 받게 됩니다.

치트 시트

C 언어의 생성자 함수는 메모리를 할당하고 필드를 초기화함으로써 객체 생성을 시뮬레이션합니다. 일반적으로 create_ 명명 패턴을 따릅니다.

생성자 함수는 세 가지 작업을 수행합니다:

  • malloc을 사용하여 메모리를 할당합니다
  • 모든 필드를 적절한 값으로 초기화합니다
  • 새 객체에 대한 포인터를 반환합니다

생성자 패턴 예시:

typedef struct {
    char *name;
    int age;
} Person;

Person *create_person(const char *name, int age) {
    Person *p = malloc(sizeof(Person));
    p->name = malloc(strlen(name) + 1);
    strcpy(p->name, name);
    p->age = age;
    return p;
}

생성자 사용하기:

Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);

객체가 힙(heap)에 존재하고 함수가 반환된 후에도 유지되기 때문에 함수는 포인터를 반환합니다. 이는 생성 로직을 한 곳에 캡슐화하여 코드를 더 깔끔하게 만들고 오류 발생 가능성을 줄여줍니다.

직접 해보기

#include <stdio.h>
#include <stdlib.h>
#include "book.h"

int main() {
    char title[256];
    int pages;
    
    // 입력 읽기
    fgets(title, sizeof(title), stdin);
    // 개행 문자가 있으면 제거
    for (int i = 0; title[i]; i++) {
        if (title[i] == '\n') {
            title[i] = '\0';
            break;
        }
    }
    scanf("%d", &pages);
    
    // TODO: 제공된 값으로 새 책을 생성하기 위해 create_book을 사용하세요
    
    // TODO: 요구된 형식으로 책 정보를 출력하세요:
    // Title: {title}
    // Pages: {pages}
    
    // TODO: 완료 후 할당된 메모리를 해제하는 것을 잊지 마세요
    
    return 0;
}
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨