[c언어] 헤더(header) 파일이란? 헤더 파일 개념 정리

업데이트:

헤더(header) 파일이란? 헤더 파일 개념 정리

참고 링크

헤더 파일이 필요한 이유

우리가 프로그래밍을 할 때는 수많은 함수들을 만들게 됩니다. 한 두개라면 관리하기도 쉽고 기억하기도 쉽지만, 내가 만든 함수 갯수가 10개, 100개, 1000개로 늘어나면 어떨까요? 잠깐, 내가 그 함수를 만들었었나? 라며 헷갈릴 것입니다.

음식점을 예로 들어보겠습니다. 하나의 음식점에서는 여러 가지 음식을 파는데요. 다양한 음식 관리에 도움을 주는 존재가 있습니다. 그것은 바로 메뉴판인데요. 메뉴판이 있으면 주인 입장에서는 내가 만든 메뉴가 어떤게 있는지 한눈에 알아볼 수 있고, 손님 입장에서도 메뉴판을 보고 원하는 음식을 주문할 수 있습니다.

헤더 파일은 바로 이 메뉴판에 비유할 수 있습니다. 헤더 파일에 내가 만든 함수들을 정리해 놓음으로써 관리 및 사용하기 쉬워집니다.

헤더 파일을 사용하지 않고 프로그래밍하기

먼저 헤더 파일을 사용하지 않고 프로그래밍 해보겠습니다. 코드 이름은 test01.c 라고 짓겠습니다.

#include <stdio.h>

int main(void)
{
  int result = sum(1,2);
  print("answer is %d \n", result);
  
  return 0;
}

int sum(int a, int b)
{
  return (a+b);
}

위 코드에서는 제가 직접 sum이라는 함수를 정의했습니다. sum 함수는 int형 숫자 두개를 더하는 역할을 합니다. 코드를 보시면 하나의 소스코드에 제가 정의한 sum 함수와 main 함수가 다같이 있는 것을 알 수 있습니다. 제가 만든 함수가 1개라서 망정이지 100개, 1000개로 늘어난다면 소스코드의 길이가 상상할수 없을 정도로 길어질 것입니다.

$ ls
test01.c

소스코드가 1개이므로 디렉토리내 파일이 1개 존재한다는 것을 알 수 있습니다. 그럼 위 코드가 잘 실행되는지 보겠습니다.

$ gcc -o test01 test01.c
$ ./test01
answer is 3

위 코드에서는 제가 헤더파일을 사용하지 않는다고 했지만 사실 1개 사용했습니다. 바로 stdio.h 인데요. stdio는 standard input output, 즉, 표준 입출력을 의미하는데 c언어에서 제공하는 헤더파일입니다. 제가 stdio.h 헤더 파일을 사용한 이유는 printf 함수를 사용하기 위함이었습니다. 즉, stdio.h 파일 내에 printf 함수가 정의되어 있는 것입니다.

헤더 파일을 사용해서 프로그래밍 하기

앞서 만든 test01.c 코드의 내용을 헤더 파일을 사용해서 프로그래밍 해보겠습니다.

main.c

#include <stdio.h>
#include "myhead.h"

int main(void)
{
  int result = sum(1,2);
  printf("answer is %d \n", result);
  
  return 0;
}

위 코드는 메인 소스코드 파일입니다. 해당 파일에는 두가지 헤더파일을 불러옵니다. stdio.h 와 같은 c언어 표준 파이브러리는 꺽쇠 <>를 사용해서 불러오고, myhead.h와 같은 제가 만든 임의의 헤더 파일은 쌍따옴표 ““로 묶어서 불러옵니다. 이 때 주의해야할 점은 헤더 파일이 메인 코드와 같은 디렉토리 내에 존재할때는 위 코드 처럼 헤더파일 이름만 적어줘도 좋지만, 만약 헤더파일이 메인 코드와 다른 디렉토리에 존재한다면 경로를 적어줘야합니다.

myhead.h

int sum(int a, int b);

위 코드는 헤더 파일입니다. sum 함수가 선언(declaration)되어 있는 것을 알 수 있습니다.

myhead.c

int sum(int a, int b)
{
  return (a+b);
}

위 코드는 헤더 파일의 소스 코드입니다. 헤더파일 myhead.h에 정의되어있는 함수가 정의(되어 있는 것을 알 수 있습니다.

컴파일 하기

$ ls
main.c myhead.c myhead.h

우리가 만든 파일이 main.c, myhead.c, myhead.h로 세가지 파일이 디렉토리 내 존재한다는 것을 알 수 있습니다.

$ gcc -o test01 main.c myhead.c
answer is 3

위와 같이 컴파일이 잘 되는 것을 알 수 있습니다. 이때 주의해야할 점은 main.c 파일만 컴파일 하는것이 아니라, 헤더 소스파일인 myhead.c도 함께 컴파일 해야한다는 것입니다. 만약 myhead.c를 컴파일 하지 않고 main.c만 컴파일 하면 다음과 같이 에러가 뜹니다.

$ gcc -o test01 main.c
/tmp/cczoIUiA.o : In function 'main':
main.c(.text+0x13): undefined reference to 'sum'
collect2: error: ld returned 1 exit status

헤더 소스파일을 함께 컴파일 하지 않으면 위와 같이 메인 소스코드의 sum함수를 인식하지 못하는 것을 알 수 있습니다.