고급 C 프로그래밍 – 프리프로세서 – 2편: 헤더 파일의 모든 것
안녕하세요, 여러분! 😄
이번 시간에는 C 언어의 프로그램 구조를 깔끔하게 나누고,
재사용성과 협업을 극대화하는 마법의 도구, **헤더 파일(Header File)**에 대해 배워볼게요!
📂 헤더 파일은 마치 “코드의 서랍장” 같아요.
자주 쓰는 정의와 선언들을 정리해 두면, 필요할 때 꺼내 쓰기 정말 좋답니다.
그럼 지금부터, 헤더 파일의 개념부터 실전 작성법, 주의사항까지
차근차근 알아볼게요! 😊
1. 헤더 파일이란?
헤더 파일은 .h
확장자를 가지며,
함수의 선언, 매크로, 상수, 구조체 정의 등을 담고 있는 선언용 파일입니다.
✅ “함수의 몸체는
.c
파일에”,
“함수의 이름과 틀은.h
파일에!” 라고 기억하시면 돼요!
2. 왜 헤더 파일을 사용할까요?
이유 | 설명 |
---|---|
코드 재사용 | 여러 소스 파일에서 공통 선언을 공유 가능 |
코드 분리 | 선언과 구현을 분리하여 가독성 향상 |
유지보수 | 하나의 헤더만 수정해도 전체 적용 가능 |
컴파일 속도 향상 | 중복 제거, 필요한 선언만 불러오기 가능 |
3. 헤더 파일의 기본 구조
// mymath.h
#ifndef MYMATH_H
#define MYMATH_H
#define PI 3.14159
int add(int a, int b);
int multiply(int a, int b);
#endif
🔐
#ifndef
~#define
~#endif
구조는 **헤더 가드(Header Guard)**입니다.
헤더가 중복 포함되는 것을 방지해 줘요!
4. 헤더 파일 포함하기: #include
표준 헤더 포함
#include <stdio.h>
#include <math.h>
- 꺾쇠 괄호
< >
는 표준 라이브러리 헤더를 의미해요.
사용자 정의 헤더 포함
#include "mymath.h"
- 쌍따옴표
" "
는 같은 디렉터리 내 사용자 정의 헤더를 찾습니다.
5. 헤더 파일과 구현 파일 연결
mymath.h (헤더 파일)
#ifndef MYMATH_H
#define MYMATH_H
int add(int a, int b);
int multiply(int a, int b);
#endif
mymath.c (구현 파일)
#include "mymath.h"
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) {
return a * b;
}
main.c (사용자)
#include <stdio.h>
#include "mymath.h"
int main() {
printf("3 + 4 = %d
", add(3, 4));
return 0;
}
💡 헤더에 선언만,
.c
파일에 구현을!
그리고 메인에서 include만 하면 끝!
6. 함수 선언 vs 함수 정의
구분 | 예시 | 설명 |
---|---|---|
선언 | int add(int, int); |
“이런 함수가 있어요!” 라고 알려주는 역할 |
정의 | int add(int a, int b) { return a + b; } |
실제 동작 내용 포함 |
헤더 파일에는 선언만 넣는 게 원칙이에요! 정의는
.c
파일에 넣어야 합니다.
7. 여러 파일에서 헤더 공유하기
프로젝트가 커질수록 소스 파일이 많아져요.
이럴 때 공통 기능을 헤더로 묶어두면 참 편하답니다!
project/
│
├── main.c
├── utils.c
├── utils.h
└── config.h
모든 .c
파일에서 #include "utils.h"
만 해주면 끝!
8. 실전 예제: 구조체와 매크로 포함된 헤더
// person.h
#ifndef PERSON_H
#define PERSON_H
#define MAX_NAME 50
typedef struct {
char name[MAX_NAME];
int age;
} Person;
void printPerson(Person p);
#endif
// person.c
#include <stdio.h>
#include "person.h"
void printPerson(Person p) {
printf("이름: %s, 나이: %d
", p.name, p.age);
}
// main.c
#include "person.h"
int main() {
Person p = {"김코딩", 25};
printPerson(p);
return 0;
}
🤩 헤더 덕분에 메인 파일이 깔끔하고 보기 쉬워졌죠?
9. 주의할 점 정리
항목 | 주의사항 |
---|---|
헤더 중복 포함 | 반드시 #ifndef ~ #define ~ #endif 로 감싸기 (헤더 가드) |
함수 정의 금지 | 헤더 파일에는 선언만! 정의는 .c 파일에 |
순환 참조 주의 | A가 B를 포함하고, B가 A를 포함하면 무한루프 발생 |
전역 변수 선언 시 extern | 헤더에 전역 변수가 있을 땐 extern 사용 후 .c 에서 초기화 |
경로 지정 | #include "header.h" 는 상대경로 기준이므로 빌드 환경에 따라 경로 주의 |
✅ 요약 정리
핵심 요소 | 설명 |
---|---|
.h 파일 |
선언과 정의 분리, 재사용 가능 |
#include |
헤더 파일 포함 지시어 |
헤더 가드 | #ifndef ~ #define ~ #endif |
선언 위치 | 헤더 파일에 함수/구조체/매크로 선언 |
구현 위치 | .c 파일에 함수 정의 |
마무리하며 💬
헤더 파일은 C 언어에서 모듈화, 유지보수, 협업의 핵심입니다!
처음엔 생소하고 귀찮아 보여도, 프로젝트가 커질수록
그 진가가 빛나는 보물 상자 같은 존재죠. ✨
🎯 “하나의 헤더로 많은 파일을 움직일 수 있다면,
당신은 이미 고급 C 프로그래머의 길에 들어선 것입니다!”
다음 편에서는 더 고급 프리프로세서 기능인
문자열 매크로화(#
), 토큰 연결(##
), 그리고 실전 팁들을 배워볼게요!
계속 함께 해주세요! 😎🔥