1. 헤더파일의 역할
헤더파일은 함수, 매크로, 구조체, 클래스 등의 정의를 담고 있는 파일이다
다른 소스파일에서 헤더파일을 include하여 해당 코드를 재사용하거나 모듈화할 수 있다
헤더파일은 일반적으로 .h 확장자를 가지며, 함수의 정의가 아닌 선언만 포함한다
2. 헤더파일 중복의 문제점
헤더파일을 여러 소스파일에서 중복해서 include하는 경우, 동일한 내용이 중복으로 정의될 수 있다
이로 인해 컴파일러는 같은 클래스, 함수 등을 중복 정의하는 것으로 인식하게 된다
이는 컴파일 시간이 증가하고 메모리 사용량이 증가하는 원인이 되고, 코드의 가독성과 유지보수성이 저하될 수 있다
3. 헤더파일 중복방지 지시자
이를 방지하기 위해 C++에는 두가지 지시자가 있는데, #Pragma once와 #ifndef ~endif이다
#ifndef 구문은 조건문을 통해 실행여부를 판단하고, #pragma once 구문은 '이 파일을 한번만 읽어들여라' 라는 뜻이다
두 지시자의 차이를 확인해보자
4-1. #ifndef ~ endif
//Header1.h
#ifndef HEADER1_H
#define HEADER1_H
#include <iostream>
class Header1() {
//구현 생략
};
#endif // HEADER1_H
여러 예제를 참고했을 때 _가 각각 다르게 작성되는데 (HEADER1_H, HEADER1_H_, _HEADER1_H_)
어떤 식으로 써도 상관없다. 다만 ifndef와 define에는 똑같이 작성하도록 하자
//Header2.h
#ifndef HEADER2_H
#define HEADER2_H
#include "Header1.h"
class Header2() {
//구현 생략
};
#endif // HEADER2_H
//main.cpp
#include <iostream>
#include "Header1.h"
#include "Header2.h"
int main() {
Header1 h1;
Header2 h2;
return 0;
}
위와 같이 main.cpp에서 두 헤더파일을 include 할 때, Header1.h 파일이 중복 include 되는 것을 확인할 수 있다.
4-2. #Pragma once
//header1.h
#pragma once
class Header1() {
//구현 생략
};
pragma once는 헤더파일의 포함횟수에 관계없이 단 한번만 처리를 하고 같은 파일의 경우 파일을 읽기 조차 하지않는다
5. 정리
| 안정성, 범용성 | 컴파일 속도 | |
| #pragma once | 지양 | 빠름 |
| #ifndef ~ #endif | 권장 | 느림 |
#pragma once의 경우 컴파일 동안 오직 한번만 포함되도록 하므로 #pragma once가 명시되면 컴파일러가 파일 열기 자체를 시도하지 않아 컴파일 속도가 빨라진다.
하지만 #pragma once는 일부 구형 컴파일러에서 지원하지 않아 안정성과 범용성에 있어서 #ifndef ~ endif보다는 떨어진다
결론은 구형 컴파일러에서 동작한다면 #ifndef ~ endif를, 그 외에 경우에는 #pragma once를 사용하도록 한다
'C++' 카테고리의 다른 글
| [C++] System() 함수 - "cls" , "pause" (0) | 2025.06.13 |
|---|---|
| [C++] 얕은 복사 vs 깊은 복사 (1) | 2025.06.12 |
| [C++] 스마트 포인터(Smart Pointer) 개념 정리 (0) | 2025.06.12 |
| [C++] 깔끔한 코드 작성법 - 헤더파일과 소스파일을 나누는 이유 (0) | 2025.06.05 |
| [C++] String 클래스 정리 및 함수 사용 (0) | 2025.06.04 |