생성자 패턴
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 12번째.
Java나 C++와 같은 언어에서는 생성자를 사용하여 객체를 만듭니다. 생성자는 memory를 자동으로 할당하고 field를 초기화하는 특수한 function입니다. C에는 이러한 기능이 없지만, 간단한 패턴인 create_ function으로 이를 흉내 낼 수 있습니다.
C에서 생성자 function은 일반적으로 세 가지 작업을 수행합니다. malloc으로 memory를 할당하고, 모든 field를 적절한 값으로 초기화하며, 새 객체에 대한 pointer를 return합니다:
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;
}
function은 객체가 stack이 아닌 heap에 존재하기 때문에 pointer를 반환합니다. 이는 function이 return한 후에도 객체가 유지되며 자유롭게 전달될 수 있음을 의미합니다. 호출자는 이를 다음과 같이 사용합니다:
Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);
생성자가 구조체를 할당하고, 문자열을 위한 공간을 할당하며, 데이터를 복사하는 등 모든 복잡한 세부 사항을 처리하는 방식을 주목하세요. 호출자는 초기 값만 제공하고 바로 사용할 수 있는 객체를 받습니다. 이렇게 하면 생성 로직이 한곳에 캡슐화되어 코드가 더 깔끔하고 오류가 발생할 가능성도 줄어듭니다.
챌린지
쉬움힙에 책 객체를 생성하는 생성자 패턴을 사용하는 Book 모듈을 만들어 보겠습니다. 모든 memory Allocate 및 초기화를 처리하고 바로 사용할 수 있는 pointer를 return하는 create_ function을 작성하는 연습을 하게 됩니다.
세 개의 파일을 만듭니다:
book.h: 두 멤버를 가진Book구조체를 Declare합니다:char *title(dynamically 할당된 문자열을 가리키는 pointer) 및int pages입니다. 제목 문자열과 page 수를 받아 새로 생성된 Book을 가리키는 pointer를 return하는 생성자create_bookfunction도 Declare합니다. 기호BOOK_H를 사용하여 include guards를 적용합니다.book.c:create_bookfunction을 Implement합니다. 생성자는 먼저 Book 구조체 자체에 대한 memory를 Allocate한 다음, title 문자열을 위한 별도의 memory를 Allocate해야 합니다(null 종결 문자를 위한 공간도 고려해야 합니다). title을 새 memory로 Copy하고, pages field를 설정한 다음, 새 Book을 가리키는 pointer를 return합니다.main.c: 생성자를 사용하여 책을 만들고 해당 information을 표시합니다.
두 가지 입력을 받습니다: book title(문자열)과 number of pages(정수)입니다.
main 파일에서 create_book을 사용하여 provided 값으로 새 책을 만든 다음, 다음 format으로 해당 information을 Print합니다:
Title: {title}
Pages: {pages}예를 들어 입력이 The C Programming Language와 272인 경우 출력은 다음과 같습니다:
Title: The C Programming Language
Pages: 272생성자가 모든 생성 로직을 캡슐화한다는 점을 remember하세요. 호출자는 단순히 초기 값을 제공하고 바로 사용할 수 있도록 완전히 초기화된 객체를 받습니다.
REQUIRED OUTPUT FORMAT:직접 해보기
#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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러