1. 개요
1.1 문서 개요
이 문서는 C++에서 사용되는 소스 파일 구조, 특히 .cpp
와 .h
파일의 역할과 분리 설계 방식에 대해 설명합니다. 객체 지향적이고 모듈화된 C++ 개발을 위해 소스와 선언을 명확히 구분하는 파일 구조는 코드 유지보수와 확장성 확보에 있어 중요한 역할을 수행합니다. 본 문서는 .cpp
와 .h
파일이 갖는 구조적 의미와 구성 원칙을 중심으로 기술합니다.
2. 내용
2.1 헤더 파일(.h
)의 역할과 구조
2.1.1 선언부 분리
헤더 파일은 주로 클래스 선언, 함수 원형(prototype), 매크로 정의, 상수, 타입 정의 등을 포함합니다. 구현 세부는 제외되고, 외부에서 사용할 인터페이스만을 기술합니다.
2.1.1.1 예시: math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
namespace MathUtils {
int add(int a, int b);
int subtract(int a, int b);
}
#endif // MATH_UTILS_H
2.1.2 헤더 가드
헤더 가드는 중복 포함을 방지하기 위해 사용되며, #ifndef
, #define
, #endif
전처리기를 통해 구성됩니다. C++20부터는 #pragma once
도 일반적으로 사용됩니다.
2.2 소스 파일(.cpp
)의 역할과 구조
2.2.1 구현부 정의
.cpp
파일은 실제 함수 구현을 포함합니다. 동일 이름의 .h
파일과 연계되어 선언된 함수나 클래스의 세부 동작을 기술합니다.
2.2.1.1 예시: math_utils.cpp
#include "math_utils.h"
namespace MathUtils {
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
}
2.2.2 main.cpp
의 역할
프로그램 진입점인 main()
함수는 일반적으로 별도 파일인 main.cpp
에 위치하며, 여러 모듈을 포함하여 실행 로직을 담당합니다.
#include <iostream>
#include "math_utils.h"
int main() {
int result = MathUtils::add(3, 4);
std::cout << "Result: " << result << std::endl;
return 0;
}
2.3 프로젝트 구조 예시
2.3.1 일반적인 디렉토리 및 파일 구성
project/
├── include/
│ └── math_utils.h
├── src/
│ └── math_utils.cpp
└── main.cpp
include/
: 헤더 파일을 모아두는 디렉토리src/
: 소스 파일이 위치main.cpp
: 실행 시작점
2.4 분리 설계 원칙 및 장점
2.4.1 변경 최소화와 재사용성 향상
- 구현부 변경 시, 인터페이스가 고정되어 있다면 다른 파일 재컴파일이 최소화됩니다.
- 헤더를 외부에 제공함으로써, 라이브러리 사용자는 구현을 알 필요 없이 사용이 가능합니다.
2.4.2 빌드 시스템 효율화
- 파일 단위 컴파일 및 링크 구조로 인해 병렬 빌드가 용이하며, 대규모 프로젝트에서 빌드 시간이 단축됩니다.
2.4.3 유지보수와 확장 용이성
- 인터페이스와 구현의 분리로 인해 코드 관리가 쉬워지며, 기능 확장 및 디버깅에 유리합니다.
3. 마무리
C++ 소스 구조는 인터페이스를 담당하는 헤더 파일(.h
)과 구현을 담당하는 소스 파일(.cpp
)의 분리 원칙에 기반합니다. 이러한 구조는 코드 재사용성, 컴파일 효율, 유지보수성 향상 등의 이점을 제공합니다. 헤더 가드 및 디렉토리 구조 관리는 프로젝트의 확장성과 안정성에 중요한 요소이며, 일관된 구조 설계를 통해 고도화된 C++ 애플리케이션 개발이 가능합니다.