코드가 길어지고 함수가 길어지면, 가독성이 점점 떨어집니다. 하지만 방대한 양의 데이터를 다루려면 코드와 함수가 길어질 수 밖에 없는 진퇴양난의 상황에 빠지게 됩니다. 그래서 이것을 해결하기 위해 분할컴파일을 사용합니다.
즉, 하나의 프로그램을 여러 개의 소스 파일로 나누어 각각 독립적으로 컴파일하면 디버깅하기 쉽고 유지 보수와 코드 재활용에 유리합니다.
보통 사용자 정의 함수를 메인함수 아래에 사용하려면, 상단에 먼저 함수 선언을 한 뒤에 밑에 정의가 가능합니다. 그 때, 메인함수 위에있는 선언부가 헤더파일쪽이고, 메인함수 아래에있는 정의부가 소스파일쪽입니다. 말로만 들어서는 알기 어렵습니다. 직접 예제를 작성해보겠습니다.
문자열 함수만들었을 때 사용했던 함수들을 가져와봤습니다.

str.h
#ifndef _STR_H //정의되어있지 않으면
#define _STR_H //여기부터
#include <stdio.h>
int strlen2(char* pstr);
char* strcpy2(char* pdest, char* psrc);
int strcmp2(char* pstr1, char* pstr2);
char* strcat2(char* pstr1, char* pstr2);
int toUpper(char ch);
int toLower(char ch);
#endif //여기까지 정의한다. -> 중복선언을 막기위한 장치입니다.
str.c
#include "str.h"
int strlen2(char* pstr) {
int count = 0;
while (*pstr) {
pstr++;
count++;
}
return count;
}
char* strcpy2(char* pdest, char* psrc) {
char* porigin = pdest;
while (*psrc) { // 포인터식
*pdest = *psrc;
psrc++;
pdest++;
}
*pdest = NULL;
return porigin;
}
int strcmp2(char* pstr1, char* pstr2) {
while (*pstr1) {
if (*pstr1 != *pstr2) { // 문자가 다른 경우
return 1;
}
pstr1++;
pstr2++;
}
if (*pstr2 == NULL) { // *pstr1의 NULL 종료문자 위치와 같은 위치에 *pstr2도 NULL 종료문자가 있는 경우
return 0;
}
return 1;
}
char* strcat2(char* pstr1, char* pstr2) {
char* pOrigin = pstr1;
while (*pstr1) {
pstr1++;
}
while (*pstr2) {
*pstr1 = *pstr2;
pstr1++;
pstr2++;
}
*pstr1 = NULL;
return pOrigin;
}
int toUpper(char ch) { // 대문자 변경
if (ch >= 97 && ch <= 122) {
ch -= 32;
}
return ch;
}
int toLower(char ch) { // 소문자 변경
if (ch >= 65 && ch <= 90) {
ch += 32;
}
return ch;
}
main.c
#include "str.h"
int main() {
char str[30] = "Monster";
char buff[30];
// 1. 문자열 길이함수 strlen2
int count = strlen2(str);
printf("str: %s 문자열의 문자의 갯수는: %d\n", str, count);
// 2. 문자열 복사함수 strcpy2
char* pstr = strcpy2(buff, str);
printf("buff: %s\n", buff);
// 3. 문자열 비교함수 strcmp2
int isSame = 0;
isSame = strcmp2(str, buff); // 같으면 0을 리턴, 다르면 1을 리턴
if (isSame) {
printf("str: %s와 buff: %s 의 문자열이 다르다.\n", str, buff);
}
else {
printf("str: %s와 buff: %s 의 문자열이 같다.\n", str, buff);
}
char str1[30] = "mon";
char str2[] = "ster";
pstr = strcat2(str1, str2);
printf("str1: %s, str2: %s, pstr: %s\n", str1, str2, pstr);
int ch = toUpper('k');
printf("ch = %c\n", (char)ch);
ch = toLower('L');
printf("ch = %c\n", (char)ch);
return 0;
}
결과
str: Monster 문자열의 문자의 갯수는: 7
buff: Monster
str: Monster와 buff: Monster 의 문자열이 같다.
str1: monster, str2: ster, pstr: monster
ch = K
ch = l
이런식으로 나누면 오류를 발견하고 고치기가 수월해집니다.