.cpp)에서 모든 코드를 작성하면 프로젝트가 커질수록 관리가 어려워짐헤더 파일(.h)과 소스 파일(.cpp)을 분리하여 관리하는 것이 일반적| 파일 유형 | 역할 |
|---|---|
| 헤더 파일(.h) | 함수 및 클래스의 선언부(인터페이스) |
| 소스 파일(.cpp) | 함수 및 클래스의 구현부(구체적인 실행 코드) |
| 메인 파일(main.cpp) | 프로그램 실행을 담당하며 필요한 헤더 파일을 포함 |
#pragma once 와 헤더 가드#pragma once
#ifndef ~ #define ~ #endif 방식보다 간편하고 직관적#ifndef _TEST1_H__
#define _TEST1_H__
// 헤더 파일 내용
#endif // _TEST1_H__
#ifndef(define이 안 되어 있으면) → #define으로 선언하여 중복 포함 방지#pragma once와 역할은 같지만, 모든 컴파일러에서 지원되지는 않음Test1.h (헤더 파일)#pragma once // 중복 포함 방지
#include <iostream> // 표준 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
struct StatInfo // 캐릭터의 상태 정보 구조체
{
int hp;
int attack;
int defence;
};
void Test_1(); // 함수 선언
void Test_2(); // 함수 선언
void Test_3(); // 함수 선언
📌 설명
#pragma once를 사용하여 중복 포함을 방지StatInfo 구조체는 캐릭터의 상태 정보를 저장 (hp, attack, defence)Test_1(), Test_2(), Test_3() 함수 선언 (구현은 Test1.cpp에서 진행)Test1.cpp (소스 파일)#include "Test1.h" // 헤더 파일 포함
void Test_1() // 함수 정의
{
Test_2(); // Test_2 함수 호출
}
void Test_2() // 함수 정의
{
cout << "Hello World" << endl; // "Hello World" 출력
}
void Test_3() // 함수 정의 (현재는 빈 함수)
{
}
📌 설명
Test1.h를 포함하여 함수 선언을 가져옴Test_1() 함수에서 Test_2()를 호출Test_2() 함수는 "Hello World"를 출력Test_3()은 현재 아무 동작도 하지 않음main.cpp (메인 파일)#include "Test1.h" // Test1 헤더 파일 포함
#include <iostream> // 표준 입출력 라이브러리 포함
using namespace std;
int main()
{
Test_2(); // Test_2 함수 호출 ("Hello World" 출력)
return 0; // 프로그램 종료
}
📌 설명
Test1.h를 포함하여 Test_2()를 호출Test_2()가 "Hello World"를 출력return 0;을 통해 정상적으로 프로그램 종료#ifndef) VS #pragma once 비교| 방식 | 설명 | 장점 | 단점 |
|---|---|---|---|
#pragma once | 컴파일러가 한 번만 포함하도록 처리 | 간단하고 빠름 | 일부 구식 컴파일러에서 지원되지 않음 |
#ifndef ~ #define ~ #endif | 직접 중복 포함 여부를 체크하여 처리 | 모든 컴파일러에서 지원됨 | 코드가 길어질 수 있음 |
#pragma once를 선호 (더 간결하고 빠름)#ifndef ~ #endif 사용✅ 코드 재사용성 증가
✅ 협업 및 유지보수 용이
✅ 컴파일 시간 단축 (불필요한 재컴파일 방지)
✅ 가독성 향상 (코드가 논리적으로 분리됨)