소년코딩

01.10 - 헤더 파일 (Header file)

.cpp 확장자를 가진 코드 파일은 C++ 프로그램의 유일한 파일이 아니다. 다른 유형의 파일을 헤더 파일(header file)이라고 한다. 헤더 파일은 보통 .h 확장자를 가지며, 다른 파일에 대한 선언을 가지고 있다.

#include <filename>

<>는 컴파일러와 함께 제공되는 헤더 파일을 include 할 때 사용한다. 위 헤더 파일은 C++ 런타임 라이브러리의 헤더 파일로써 운영체제의 특별한 위치에 존재한다.

#include "filename"

""는 소스 파일이 있는 디렉터리에서 헤더 파일을 include 하도록 전처리기(preprocesser)에게 지시한다. 일반적으로 이와 같은 방법으로 자신이 작성한 헤더 파일을 include 한다.

표준 라이브러리 헤더 파일

#include <iostream>

int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

위 프로그램은 cout를 사용해서 "Hello, world!"를 콘솔에 출력한다. 이 프로그램은 cout를 정의하지 않았지만 iostream이라는 헤더 파일에 선언되어있으므로 컴파일러는 오류를 발생하지 않는다.

#include <iostream>을 사용하면 'iostream'이라는 헤더 파일의 모든 내용을 복사해오도록 요청한다. 이렇게 하면 헤더 파일의 내용을 코드 파일에서 사용할 수 있다.

헤더 파일은 일반적으로 선언만 포함하므로 어떻게 구현되는지 정의하지는 않는다. 실제 정의는 링크 단계에서 자동으로 프로그램에 링크되는 C++ 런타임 지원 라이브러리에서 구현된다.

IncludeLibrary

만약 iostream 헤더 파일이 존재하지 않는다면, cout과 관련된 모든 선언을 각 파일의 맨 위로 일일이 복사해야 한다.


헤더 파일 작성하기

'01.09 - 전방 선언과 정의'에서 컴파일러가 main.cpp를 컴파일할 때 'add'가 무엇인지 알 수 있도록 전방 선언(forward declaration)을 했었다. 사용하고자 하는 모든 함수에 대한 전방 선언을 각 파일에 작성하는 것은 매우 지루한 일이다.

헤더 파일은 이러한 부담을 줄여 준다. 헤더 파일을 사용하면 선언을 필요한 만큼 한 번만 작성하면 되고, 함수 원형에 대한 유지보수를 편하게 해준다.

헤더 파일은 두 부분으로 구성된다.

첫 번째 부분은 헤더 가드(header guard)라고 하며 헤더 파일이 같은 파일에서 두 번 이상 포함(include)되지 않게 해준다.

두 번째 부분은 .h 파일의 실제 내용이다. 이 내용은 다른 파일에서 볼 수 있는 모든 함수에 대한 선언이다.

add.h
// 헤더 가드의 시작
#ifndef ADD_H
#define ADD_H

// .h 파일의 실제 내용: 선언
int add(int x, int y); // add() 함수 원형(function prototype)

// 헤더 가드의 끝
#endif

main.cpp 파일에서 헤더 파일을 사용하려면 헤더 파일을 포함(include)해야 한다.

main.cpp
#include <iostream>
#include "add.h"   // add.h 헤더파일 포함

int main()
{
    std::cout << "The sum of 3 and 4 is " << add(3, 4) << std::endl;
    return 0;
}
add.cpp
int add(int x, int y)
{
    return x + y;
}

컴파일러가 #include "add.h" 라인을 컴파일하면 add.h의 내용을 현재 파일의 그 라인 시점에 복사한다. add.h에 add() 함수에 대한 함수 원형이 포함되어 있으므로 이 원형은 add() 함수의 전방 선언(forward declaration)으로 사용된다.

결과적으로 올바르게 컴파일되고 링크된다.

IncludeHeader


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/19-header-files/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기