나의 작은 valley
[cpp] 헤더 파일 본문
상식적으로 한 c++ 파일에 모든 코드를 다 작성하는건 버거운 일이다. 각자 만든 코드들을 한데 모으는 방법에 대해 설명하려고 한다.
다른 파일에서 정의된 class를 가져온다고 하는 상황을 예로 들어보자. 그러면 최소 3개의 파일이 필요하다.
1) class가 정의된 Cpp 파일
2) 정의된 class를 가져와 사용할 Main Cpp 파일
3) class 정보가 담긴 Header 파일(확장자 .h)
Main 파일
#include <iostream>
#include <cstring>
#include "MyClass.h"
using namespace std;
int main()
{
MyClass cls1;
MyClass cls2(123);
cls1.Print();
cls2.Print();
cls1.Increment(1);
cls1.Print();
cls2.Decrement(123);
cls2.Print();
return 0;
}
MyClass.h라는 헤더파일을 가져온 이후에 MyClass 내부에 정의된 Print(),Increment(),Decrement() 함수를 호출하는 것을 볼 수 있다. 그러면 헤더파일은 어떻게 생겼을까?
Header 파일
#ifndef MY_CLASS_H //여러 군데에서 사용이 될 떄 컴파일을 한번만 해라.
#define MY_CLASS_H
class MyClass
{
public:
MyClass();
MyClass(int a);
~MyClass();
void Increment(int a);
void Print();
void Decrement(int a);
private:
int number_ = 0;
};
#endif
헤더 파일에는 생성자, 함수, 소멸자, 맴버 변수등등이 담겨있다. 그러나 각각이 어떤 기능을 수행할 지는 적혀있지 않은 것을 확인할 수 있다.
또한 ifndef, endif 라는 새로운 키워드가 보인다. 이는 여러 곳에서 MyClass가 호출되어도 이 헤더 파일 1번만 컴파일 하면 된다는 의미를 가지고 있다.
MyClass가 정의된 cpp 파일
#include "MyClass.h"
#include <iostream>
using namespace std;
MyClass::MyClass()
{
cout << "MyClass()" << endl;
}
MyClass::MyClass(int number)
{
cout << "MyClass(int number)" << endl;
}
MyClass::~MyClass()
{
cout << "~MyClass()" << endl;
}
void MyClass::Increment(int a)
{
number_ += a;
}
void MyClass::Decrement(int a)
{
number_ -= a;
}
void MyClass::Print()
{
cout << number_ << endl;
}
각 기능이 따로따로 구현된 것을 확인할 수 있다. 또한 :: 문자가 인상적이다.
이렇게 구현부와 정의부가 다른 이유는 만약에 해더 파일에서 함수를 구현한다면 많은 class를 정의하여 사용하는 코드의 경우 헤더 파일 안의 코드 길이가 너무 길어진다.
해더 파일을 봤을 때는 어떤 class에 어떤 함수 및 멤버들이 있는지 확인하는 정도면 충분하다. 만약 기능적인 측면이 궁금하면 그 이후에 해당 class cpp 파일에 접근하면 된다.
이러한 방식으로 훨씬 효율적으로 코드를 짤 수 있다.
'Computer Science > [c++] 문법 정리' 카테고리의 다른 글
[cpp] 템플릿(template) (0) | 2023.09.17 |
---|---|
[cpp] 텍스트 파일 입출력 (0) | 2023.09.17 |
[cpp] 구조체(struct) (0) | 2023.09.17 |
[cpp] 동적할당 (0) | 2023.09.17 |
[cpp] 함수 (0) | 2023.09.17 |