본문 바로가기
C++

헤더(.h)와 소스(.cpp)를 분리하는 이유

by Oz Driver 2025. 12. 27.

C++에서 헤더(.h)와 소스(.cpp)를 분리하는 이유를 한마디로 정리하면 컴파일 시간 비용을 줄이기 위해서입니다.

다른 객체를 사용하기 위해 컴파일러가 알아야 할 것은 그 객체의 타입 정보입니다.
객체의 내부 구현은 다른 cpp 파일 입장에서는 알 필요가 없습니다.

따라서 컴파일에 필요한 타입 정보만 헤더 파일에 두고, 구현 내용은 cpp 파일로 분리하면 이 헤더 파일을 포함한 다른 소스 파일을 컴파일 할 때 해당 객체의 구현 코드를 함께 처리하지 않아도 됩니다.

그 결과, 처리해야 할 코드량이 줄어들면서 전체 컴파일에 낭비되는 시간이 감소하게 됩니다.

1. heaer 와 cpp 의 코드 분리 

Player.h (타입 정보)

#pragma once

class Player
{    
public :
    void Move();
};

Player.cpp (구현)

#include "Player.h"
#include <iostream>

void Player::Move()
{
    std::cout << "Move\n";
}

Game.cpp (사용자)

#include "Player.h"

int main()
{
    Player p;
    p.Move();
}

 

2. 컴파일이 진행될 때 헤더가 처리되는 과정

사실 컴파일러는 헤더라는 개념을 알지 못합니다.
컴파일 대상은 오로지 cpp 파일입니다.

그렇다면 헤더 파일은 어떻게 컴파일에 사용되는 것일까요?
헤더 파일은 컴파일 이전 단계인 전처리 과정에서 처리됩니다.

 

#include 지시자를 통해 헤더 파일의 내용이 cpp 파일의 해당 위치에 텍스트 형태 그대로 삽입됩니다.

여기서 # 기호는 전처리 지시자임을 의미하며, 컴파일이 시작되기 전에 처리되어야 할 작업들을 지정합니다.
include, pragma, define, if, ifdef 등의 명령어들이 여기에 해당합니다.

 

#include는 헤더 파일의 내용을 그대로 복붙하는 동작이며, 컴파일러는 전처리 결과로 만들어진 하나의 cpp 코드 덩어리를 컴파일할 뿐입니다.

 

3. 파일이 다시 컴파일되는 기준

각 cpp 파일은 컴파일을 통해 obj 파일로 변환됩니다.
빌드 시스템은 cpp 파일의 수정 시간과 이미 생성된 obj 파일의 수정 시간을 비교하여 컴파일 여부를 결정합니다.

 

 • cpp 수정 시간이 더 최신이면 다시 컴파일

 • obj 파일이 더 최신이면 컴파일을 건너뜀

 

이 방식으로 변경되지 않은 파일들은 이번 빌드 과정에서 제외됩니다.

 

4. 링크 단계

컴파일을 통해 생성된 여러 obj 파일들은 링킹(linking) 과정을 거쳐 exe, dll, lib 같은 최종 결과물을 만듭니다.

이 단계에서 각 obj 파일에 포함된 함수와 변수들이 서로 연결됩니다.

 

5. 헤더가 다른 헤더들을 포함하고 있는 경우

주의해야 할 점은 헤더가 다른 헤더를 많이 포함할수록, cpp 파일이 한 번 컴파일될 때마다 그 모든 헤더들이 전처리 단계에서 코드로 그대로 삽입된다는 점입니다.

따라서 해당 cpp 파일에 변경이 발생해 다시 컴파일될 경우, 실제로 사용하지 않는 헤더나 이미 개발이 완료되어 수정이 필요 없는 코드들까지도 함께 파싱·컴파일되며 컴파일 시간이 불필요하게 증가하게 됩니다.

이 때문에 헤더 파일에서는 정말 필요한 헤더만 포함시키는 것이 중요합니다.

 

6. 정리

 • 헤더 파일은 컴파일 대상이 아닙니다.

 • 컴파일러는 cpp 파일만 컴파일합니다.

 • 헤더 코드는 전처리 단계에서 #include가 선언된 위치에 텍스트 형태 그대로 삽입됩니다.

 • 헤더에는 객체의 타입 정보만 작성하고, 구현은 cpp 파일에 작성합니다.

 • 이를 통해 개발 중 불필요한 컴파일 비용을 최소화할 수 있습니다.

 

 

 

 

 

'C++' 카테고리의 다른 글

전방 선언  (0) 2026.01.05
TCHAR 에 대한 이해  (0) 2026.01.04
const 는 어디에 위치하느냐에 따라 의미가 달라집니다  (0) 2026.01.02
프로그래밍 언어란 무엇인가?  (0) 2025.12.21
C++ 소개  (0) 2025.12.11