#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INITIAL_CAPACITY 4
typedef struct {
char** items;
int size;
int capacity;
} StringList;
char* strdup(const char* s) {
char* copy = malloc(strlen(s) + 1);
if (copy) strcpy(copy, s);
return copy;
}
// 초기화 함수
void initList(StringList* list) {
list->size = 0;
list->capacity = INITIAL_CAPACITY;
list->items = (char**)malloc(sizeof(char*) * list->capacity);
}
// 메모리 해제 함수
void freeList(StringList* list) {
for (int i = 0; i < list->size; i++) {
free(list->items[i]); // strdup한 문자열 해제
}
free(list->items);
}
// Add 함수 (C#의 List<string>.Add("...")와 유사)
void add(StringList* list, const char* str) {
if (list->size >= list->capacity) {
list->capacity *= 2;
list->items = (char**)realloc(list->items, sizeof(char*) * list->capacity);
}
list->items[list->size++] = strdup(str); // strdup은 문자열 복사
}
// 출력 함수
#if(0)
void printList(const StringList* list) {
for (int i = 0; i < list->size; i++) {
printf("[%d] %s\n", i, list->items[i]);
}
}
#endif
#if(1)
void printList(const StringList* list) {
printf("총 요소 수: %d개\n", list->size);
printf("현재 확보된 메모리 용량 (capacity): %d개\n", list->capacity);
for (int i = 0; i < list->size; i++) {
printf("[%d] %s\n", i, list->items[i]);
}
}
#endif
int main() {
StringList myList;
initList(&myList);
add(&myList, "apple");
add(&myList, "banana");
add(&myList, "cherry");
add(&myList, "strawberry");
add(&myList, "banana");
add(&myList, "watermelon");
add(&myList, "apple");
add(&myList, "banana");
add(&myList, "cherry");
add(&myList, "strawberry");
add(&myList, "banana");
add(&myList, "watermelon");
printList(&myList);
freeList(&myList);
return 0;
}
/*
INITIAL_CAPACITY는 동적 배열을 처음 만들 때, 메모리를 얼마나 확보할지를 정해주는 초기 크기입니다.
왜 필요한가요
C에서 배열은 고정된 크기이므로, 가변적으로 데이터를 추가하려면 처음에 최소한의 공간을 확보해야 합니다.
INITIAL_CAPACITY는 다음과 같은 이유로 중요합니다:
1. 메모리 할당을 위한 기준
malloc() 또는 realloc()으로 items 배열의 메모리를 할당할 때, 처음에는 몇 개의 문자열을 저장할 수 있게 할지 기준이 필요합니다.
2. 성능 최적화
처음부터 매번 1개씩만 공간을 늘리면, 문자열을 하나 추가할 때마다 realloc()이 발생해 성능이 매우 떨어집니다.
그래서 보통 2배씩 확장하는 방식(예: 4 → 8 → 16 ...)을 사용하는데, 그 출발점이 INITIAL_CAPACITY입니다.
3. 가독성과 유지보수
하드코딩된 숫자(4, 8 등)를 직접 쓰기보다는, INITIAL_CAPACITY처럼 이름을 붙이면 코드의 의미를 이해하기 쉽고 나중에 변경하기도 쉽습니다.
예를 들어 보면
#define INITIAL_CAPACITY 4
이렇게 하면, 처음 malloc() 할 때 4칸짜리 char* 배열을 만들고, 그 이후 추가가 생기면 8칸, 16칸...으로 늘어나게 설계합니다.
*/