고급 C 프로그래밍 – 프리프로세서 – 2 – 헤더 파일

고급 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 프로그래머의 길에 들어선 것입니다!”

다음 편에서는 더 고급 프리프로세서 기능인
문자열 매크로화(#), 토큰 연결(##), 그리고 실전 팁들을 배워볼게요!
계속 함께 해주세요! 😎🔥

답글 남기기