다중 파일 프로젝트
헤더와 번역 단위를 알아봅니다
다중 파일 프로젝트은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
파일을 나누는 이유
실제 프로그램은 하나의 .c 파일에만 들어 있지 않습니다. 코드를 여러 파일로 나누면 다음과 같은 장점이 있습니다.
- 서로 관련된 함수를 함께 묶을 수 있습니다.
- 변경된 부분만 컴파일러가 다시 빌드할 수 있습니다.
- 프로젝트 간에 코드를 재사용할 수 있습니다.
- 팀이 계속 충돌하지 않고 작업할 수 있습니다.
각 부분이 어떻게 연결되는지 이해하는 것은 필수적입니다.
번역 단위
각 .c 파일은 전처리기가 #include를 확장한 후 하나의 번역 단위가 됩니다.
컴파일러는 각 번역 단위를 서로 독립적으로 개체 파일(.o)로 변환합니다. 이 단계에서는 다른 파일에 대해 알지 못합니다.
선언과 정의
선언은 함수가 존재하며 어떤 서명을 사용하는지 컴파일러에 알립니다. 정의는 실제 본문을 제공합니다.
다른 파일은 함수를 호출할 때 선언만 알면 됩니다. 정의는 정확히 한 곳에 존재합니다.
int add(int a, int b); /* declaration: a promise */
int add(int a, int b) { /* definition: the body */
return a + b;
}헤더 파일
선언은 헤더(.h)에 작성합니다. 함수를 사용하려는 파일은 헤더를 포함합니다.
헤더는 공개 인터페이스이고, 이에 대응하는 .c 파일은 비공개 구현입니다.
/* math_utils.h */
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
int mul(int a, int b);
#endif구현 파일
.c 파일은 자체 헤더를 포함하고 함수를 정의합니다.
자체 헤더를 포함하면 컴파일러가 정의와 선언이 일치하는지 확인할 수 있습니다.
/* math_utils.c */
#include "math_utils.h"
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }모듈 사용
다른 파일은 헤더를 포함하고 함수를 호출합니다. 함수 본문을 볼 필요는 없습니다.
컴파일러는 선언을 신뢰하고, 이후 링커가 호출을 실제 정의에 연결합니다.
/* main.c */
#include <stdio.h>
#include "math_utils.h"
int main(void) {
printf("%d\n", add(2, 3));
return 0;
}컴파일과 링크
두 단계로 진행됩니다. 먼저 -c를 사용해 각 파일을 개체 파일로 컴파일합니다. 그런 다음 개체 파일을 하나의 실행 파일로 링크합니다.
링커는 math_utils.o에서 정의를 찾아 add에 대한 각 호출을 해결합니다.
gcc -c main.c # -> main.o
gcc -c math_utils.c # -> math_utils.o
gcc main.o math_utils.o -o app큰따옴표와 꺾쇠괄호
포함 구문이 검색 경로를 제어합니다.
#include "math_utils.h"는 먼저 프로젝트 디렉터리를 검색합니다.#include <stdio.h>는 시스템 포함 경로만 검색합니다.
직접 만든 헤더에는 큰따옴표를, 표준 라이브러리에는 꺾쇠괄호를 사용합니다.
extern 키워드
파일 간에 전역 변수를 공유하려면 .c 파일 한 곳에서 한 번 정의하고, 헤더에서 extern으로 선언합니다.
extern은 '이 변수는 다른 곳에 존재한다'는 뜻으로, 중복 정의를 방지합니다.
/* in config.h */
extern int g_verbose; /* declaration */
/* in config.c */
int g_verbose = 0; /* the single definition */static 키워드
파일 범위에서 static을 사용하면 함수나 변수가 해당 번역 단위에서만 비공개가 됩니다.
정적 보조 함수는 다른 파일에서 링크할 수 없으므로 이름 충돌을 방지하고 구현 세부 정보를 숨깁니다. C에서 내부용 항목을 표시하는 방법입니다.
/* visible only inside this .c file */
static int helper(int x) {
return x * 2;
}단일 정의 규칙
비정적 함수나 전역 항목은 프로그램 전체에서 정확히 한 번만 정의할 수 있습니다. 여러 파일에서 선언하되, 한 파일에서만 정의해야 합니다.
add를 두 번 정의하면 multiple definition of 'add'와 같은 링커 오류가 발생합니다. 이것이 헤더에 함수 본문을 넣지 않는 이유입니다.
빠른 확인
헤더에 어떤 내용이 들어가야 하는지 생각해 보세요.
요약
이제 여러 파일로 구성된 프로젝트를 구조화할 수 있습니다.
- 각
.c파일은 번역 단위이며, 각각 독립적으로 컴파일되어.o파일이 됩니다 - 헤더에는 선언을 넣고, 각 정의는 하나의
.c파일에 넣습니다 - 링커는 객체 파일 사이의 호출을 해결합니다
extern은 전역 항목을 공유하고,static은 파일 내부 기호를 비공개로 유지합니다
다음 내용: Makefile로 빌드를 자동화합니다.
자주 묻는 질문
“다중 파일 프로젝트” 강의는 무료인가요?
네 — “다중 파일 프로젝트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“다중 파일 프로젝트”에서 뭘 배우나요?
헤더와 번역 단위를 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“다중 파일 프로젝트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 조건부 컴파일
- 다중 파일 프로젝트
- Makefile
- 정적 라이브러리와 공유 라이브러리