헤더파일을 사용하는 이유
공부하는 단계에서 와닿지 않는 이야기지만, 실제 대형 프로젝트에 들어가게 되면 코드의 양이 굉장히 방대해 지기 때문에 코드를 깔끔하게 정리할 필요가 있고 C/C++의 경우 헤더파일을 사용하여 메인 함수와 구분되는 다수의 헤더파일과 소스파일을 분할 구현한다.
헤더파일 사용 방법
두 정수의 합을 구하는 Add라는 함수를 작성해 보자.
헤더파일을 사용하지 않은 경우
#include <stdio.h>
int Add(int a, int b);
void main()
{
int a = 1;
int b = 2;
int sum = Add(a, b);
printf("%d", sum);
}
int Add(int a, int b)
{
return a + b;
}
그나마 깔끔하게 구현할 수 있는 방법으로
함수 선언 -> 메인 함수 -> 함수 구현
순으로 작성한다. 그러나 이마저도 코드의 길이가 길어지면 코드를 파악하기 어려워진다.
헤더파일을 사용한 경우
- main.cpp
#include <stdio.h>
#include "func.h"
void main()
{
int a = 1;
int b = 2;
int sum = Add(a, b);
printf("%d", sum);
}
- func.h
int Add(int a, int b);
- func.cpp
#include "func.h"
int Add(int a, int b)
{
return a + b;
}
헤더파일을 사용하게 되면 세개의 파일로 구성된다.
- 메인함수를 포함한 소스코드
- 함수를 선언한 헤더파일
- 함수를 구현한 소스코드
위 코드를 보면 헤더파일은 함수를 선언만 하고, 각각의 소스코드가 헤더파일을 참조한 것을 확인 할 수 있다.
헤더파일에 선언만 하는 이유
위 코드를 봤을때 왜 헤더파일에 구현을 하지 않는가 라는 의문이 들 수 있다.
그 이유는 헤더파일의 특성에서 알 수 있는데, 헤더파일은 참조하면 헤더파일의 내용을 그대로 복사 해 온다고 생각하면 된다.
- main.cpp
#include <stdio.h>
#include "func.h"
void main()
{
int a = 1;
int b = 2;
int sum = Add(a, b);
printf("%d", sum);
}
이 코드를 컴파일 하면 아래와 같이 치환된다 생각하면 된다.
#include <stdio.h>
int Add(int a, int b);
void main()
{
int a = 1;
int b = 2;
int sum = Add(a, b);
printf("%d", sum);
}
이 경우에는 헤더파일에 함수를 구현하였더라도 아무 문제 없겠지만, 이 헤더파일을 참조하는 소스코드가 2개 이상이되면 문제가 발생한다. 2개 이상의 소스코드가 헤더파일을 참조하면 함수가 중복으로 구현되기 때문에 컴파일에 오류가 생기게 된다.
전역변수 활용문제
분할구현을 하면 전역변수의 활용이 어려워 진다. 전역변수는 선언된 소스코드 내에서만 활용이 가능하므로 각각 분할구현된 코드내의 함수에서 전역변수의 이점을 살리며 활용할 수 없다. 이에 대한 해결방안으로 정적(static) 변수와 외부(extern) 변수가 있는데 다음 포스트에서 알아 보기로 한다.
'프로그래밍 언어 > cpp' 카테고리의 다른 글
[C++] 클래스 기초와 생성자, 소멸자 (0) | 2023.02.08 |
---|---|
[C++] 함수 포인터 (0) | 2023.02.08 |
[C++] void* 보이드 포인터 (0) | 2023.02.08 |
[C++] 상수(const)와 포인터 (0) | 2023.02.08 |
[C++] 정적(static) 변수와 외부(extern) 변수, 분할구현에서의 전역변수 사용 (0) | 2023.02.07 |