재사용 가능한 벡터 형식
크기와 용량을 감싸 보세요.
재사용 가능한 벡터 형식은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
분리된 코드에서 형식으로
포인터, 개수, 용량을 서로 다른 세 변수로 전달하면 오류가 발생하기 쉽습니다.
이들을 하나의 struct로 묶어 보겠습니다. 이것은 흔히 벡터라고 부르는 재사용 가능한 동적 배열입니다. 데이터와 관리 정보를 함께 묶어 줍니다.
벡터 구조체
벡터에는 세 가지 필드가 필요합니다. 데이터에 대한 포인터, 현재 사용 중인 요소의 수(len), 크기를 조정하기 전에 담을 수 있는 요소의 수(cap)입니다.
typedef struct {
int *data;
size_t len;
size_t cap;
} Vec;벡터 초기화
빈 벡터는 NULL 데이터 포인터와 0인 길이 및 용량을 가집니다. 간단한 초기화 함수로 의도를 명확하게 표현할 수 있습니다.
void vec_init(Vec *v) {
v->data = NULL;
v->len = 0;
v->cap = 0;
}추가 연산
vec_push는 끝에 요소 하나를 추가합니다. 벡터가 가득 차 있으면 먼저 용량을 두 배로 늘립니다.
성공하면 0을, 할당에 실패하면 -1을 반환하므로 호출자가 그에 대응할 수 있습니다.
int vec_push(Vec *v, int value) {
if (v->len == v->cap) {
size_t nc = v->cap ? v->cap * 2 : 4;
int *tmp = realloc(v->data, nc * sizeof(*v->data));
if (!tmp) return -1;
v->data = tmp;
v->cap = nc;
}
v->data[v->len++] = value;
return 0;
}요소 다시 읽기
len이 사용 중인 요소의 수를 추적하므로 0부터 len - 1까지 반복하면 됩니다. 용량은 더 클 수 있지만, 그 슬롯들은 아직 데이터의 일부가 아닙니다.
for (size_t i = 0; i < v->len; i++)
printf("%d\n", v->data[i]);벡터 해제
벡터는 자신의 힙 버퍼를 소유하므로 이에 대응하는 정리 함수가 필요합니다. 해제한 뒤에는 구조체의 필드를 초기화하여 잘못 사용하지 못하게 하십시오.
void vec_free(Vec *v) {
free(v->data);
v->data = NULL;
v->len = v->cap = 0;
}하나로 합치기
이 전체 프로그램은 벡터를 만들고, 값 다섯 개를 추가하고, 값을 출력한 다음 깔끔하게 해제합니다.
#include <stdio.h>
#include <stdlib.h>
typedef struct { int *data; size_t len, cap; } Vec;
int vec_push(Vec *v, int value) {
if (v->len == v->cap) {
size_t nc = v->cap ? v->cap * 2 : 4;
int *tmp = realloc(v->data, nc * sizeof(*v->data));
if (!tmp) return -1;
v->data = tmp; v->cap = nc;
}
v->data[v->len++] = value;
return 0;
}
int main(void) {
Vec v = {0};
for (int i = 0; i < 5; i++) vec_push(&v, i * 10);
for (size_t i = 0; i < v.len; i++) printf("%d\n", v.data[i]);
free(v.data);
return 0;
}{0}으로 0으로 초기화하기
Vec v = {0};를 작성하면 데이터 포인터를 NULL로 설정하는 것을 포함해 모든 필드가 0으로 설정됩니다.
명시적인 초기화 함수를 호출하지 않고도 벡터를 vec_push에 사용할 수 있게 해 주는 편리한 지름길입니다.
Vec v = {0}; /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);안전한 get 도우미
len을 넘어 인덱싱하는 것은 버그입니다. 간단한 접근 함수로 범위를 확인하고 오류를 알릴 수 있으며, 약간의 속도를 안전성과 맞바꿀 수 있습니다.
int vec_get(const Vec *v, size_t i, int *out) {
if (i >= v->len) return -1; /* out of range */
*out = v->data[i];
return 0;
}len과 cap을 따로 추적하는 이유
cap은 할당된 메모리의 크기이고, len은 실제로 사용하는 크기입니다.
여분의 용량을 유지하면 대부분의 추가 작업에서 realloc을 호출하지 않아도 됩니다. 이러한 분리가 벡터를 빠르고 유연하게 만드는 핵심입니다.
형식 일반화
이 벡터는 int를 저장합니다. 다른 형식을 담으려면 요소 형식을 변경하거나 요소 크기와 함께 void *를 저장할 수 있습니다.
무엇을 저장하든 패턴, 즉 초기화·추가·해제 방식은 동일합니다.
typedef struct {
double *data;
size_t len, cap;
} DVec; /* same shape, different element type */빠른 확인
벡터 형식에 대한 이해도를 확인해 보십시오.
복습
벡터는 데이터 포인터, len, cap을 하나의 구조체로 묶습니다.
vec_push는 가득 차면 용량을 두 배로 늘리고, vec_free는 버퍼를 해제한 뒤 필드를 초기화하며, {0}은 깔끔하게 초기화합니다. 이 재사용 가능한 패턴은 분리된 변수들을 일일이 관리하는 것보다 훨씬 낫습니다. 다음에는 올바르게 해제하고 누수를 피하는 방법을 알아보겠습니다.
자주 묻는 질문
“재사용 가능한 벡터 형식” 강의는 무료인가요?
네 — “재사용 가능한 벡터 형식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“재사용 가능한 벡터 형식”에서 뭘 배우나요?
크기와 용량을 감싸 보세요. 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“재사용 가능한 벡터 형식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 배열 할당하기
- realloc으로 확장하기
- 재사용 가능한 벡터 형식
- 해제하고 누수 방지하기