왜 c언어에선 헤더 파일과 소스 파일을 구분할까? (c++, c#, 빌드 프로세스)
이 글은 독자가 c언어의 빌드 프로세서에 대해서 최소한의 지식은 알고 있다는 가정하에 서술하였다.
c 계열의 언어는 헤더 파일과 소스 파일이 나눠져
주로 헤더 파일에는 declaration을, 소스 파일에는 definition을 적는다.
빌드 프로세스 과정을 간단히 나타내자면
preprocessor를 거치고 compiling 거쳐 object 파일이 만들어진다.
이렇게 만들어진 obj파일 (object 파일)들은 링커를 통해
라이브러리와 합쳐져 하나의 실행 파일을 만든다
( 간단히 서술하여 많은 내용이 생략됨. )
이 과정에서 이러한 의문을 품을 수 있다.
왜 헤더 파일과 소스 파일에 declaration과 definition을 구분하여 번거롭게 하는 것인가?
그냥 한 파일에 이 둘을 다 기입하는 건 안될까?
정답부터 말하자면 가장 큰 이점은 오브젝트 파일의 독립적 분산을 통하여 컴파일 과정에서의 시간적 절감이다.
일단 한 헤더 파일에 declaration 과 definition 을 다 적을 경우를 생각해보자
a.cpp 파일이 매번 수정할 부분이 생겨 새로 빌드를 한다고 생각해보자.
매 빌드마다 저 방대한 양의 definition 부분을 같이 수행해야한다.
대신 declaration 과 definition을 구분한다면
매번 수정을 해야할 때 a.cpp와 적은 용량의 b.h를 컴파일링하고
이미 obj파일이 되어 있을(b.cpp는 수정할 거리가 없기에 사전의 파일을 이어 쓴다)
b.obj 파일과 링킹만 시켜주면 된다.
이렇게 컴파일링 시의 시간적 이점을 가져온다.
읽어주셔서 감사합니다.