본문 바로가기
프로그래밍/C || CPP

C/C++ cpp, h 파일 분할 방법

by _BlankSpace 2017. 5. 21.

  1. C/C++ cpp, h 파일 분할하는 방법.

cpp(또는 c), h 파일을 분할하는 방법은 선언부와 정의부를 따로 관리할 수 있다는 장점이 있습니다. 이러한 점은 가독성에도 도움을 줍니다.

입문한 지 얼마 안되신 분들은 cpp와 헤더 파일을 따로 나누는 것에 복잡함을 느끼실 수 있습니다. 또한, 굳이 나눌 필요가 없는 정도의 프로그램만 작성하신 분들은 경험이 없을 수도 있습니다.

하지만, 한번만 파일을 나눠보신다면 생각보다 어렵지 않은 작업이고, 이후에는 나누어서 개발을 하게되는 자신을 보시게 될 것입니다. 따라서 이번에는 파일을 분할하는 방법을 정리하고자 합니다.


먼저, 제가 간단하게 작성한 코드를 보겠습니다.


CppClass.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
 
#define SPEED_MIN 0
#define SPEED_MAX 99
 
using namespace std;
 
enum
{
    small = 0,
    big,
    flower,
    star,
    fly
};
 
class Mario
{
    enum
    {
     down  = -10,
     up    = 10,
    };
private:
    int age;        ///<
    char status;    ///<마리오의 상태.
    int speed;        ///<
public:
    int Age(void) { return age; }
    void setAge(int _age) { age = _age; }
    char Status(void) { return status; }
    void setStatus(char _status) { status = _status; }
    int Speed(void) { return speed; }
    void setSpeed(int _speed) { speed = _speed; }
    void speedAccel(bool upAndDown);
    void printMarioStatus();
};
 
void Mario::speedAccel(bool upAndDown)
{
    if (upAndDown) {
    speed += up;
    }
    else {
    speed += down;
    }
    cout << "current speed : " << speed << endl;
}
 
void Mario::printMarioStatus()
{
    cout << "age = " << age << endl;
    cout << "status = " << (int)status << endl;
    cout << "speed = " << speed << endl;
}
 
int main(void)
{
    Mario p1, p2;
    p1.setAge(15);
    p1.setStatus(big);
    p1.setSpeed(SPEED_MIN);
   
    cout << "age : " << p1.Age() << " status : " << (int)p1.Status() << " speed : " << p1.Speed() << endl;
    return 0;
}
cs

아직 cpp와 h를 나누지 않았습니다. 물론, 이 정도의 코드는 굳이 나눌 필요가 없습니다. 가독성을 망치는 정도는 아니니까 말입니다. 하지만, 더 큰 프로그램을 이런 식으로 구현했다가는 문제 수정 시에 당신은 엄청난 고통을 받게 되겠죠?


따라서 저는 cpp와 h를 다음과 같이 나누어 보겠습니다.

- h 파일 (헤더파일) : 클래스의 선언을 담는 부분입니다.

- c/cpp 파일 : 클래스의 정의를 담는 부분입니다.


HeaderFileDivision.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef __HEADER_FILE_DIVISION__
#define ___HEADER_FILE_DIVISION__
 
#include <iostream>
 
#define SPEED_MIN 0
#define SPEED_MAX 99
 
using namespace std;
 
enum
{
    small = 0,
    big,
    flower,
    star,
    fly
};
 
 
class Mario
{
    enum
    {
     down  = -10,
     up    = 10,
    };
private:
    int age;        ///<
    char status;    ///<마리오의 상태.
    int speed;        ///<
public:
    int Age(void) { return age; }
    void setAge(int _age) { age = _age; }
    char Status(void) { return status; }
    void setStatus(char _status) { status = _status; }
    int Speed(void) { return speed; }
    void setSpeed(int _speed) { speed = _speed; }
    void speedAccel(bool upAndDown);
    void printMarioStatus();
};
 
#endif

cs


HeaderFileDivision.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "HeaderFileDivision.h"
 
void Mario::speedAccel(bool upAndDown)
{
    if (upAndDown) {
    speed += up;
    }
    else {
    speed += down;
    }
    cout << "current speed : " << speed << endl;
}
 
void Mario::printMarioStatus()
{
    cout << "age = " << age << endl;
    cout << "status = " << (int)status << endl;
    cout << "speed = " << speed << endl;
}
 
int main(void)
{
    Mario p1, p2;
    p1.setAge(15);
    p1.setStatus(big);
    p1.setSpeed(SPEED_MIN);
   
    cout << "age : " << p1.Age() << " status : " << (int)p1.Status() << " speed : " << p1.Speed() << endl;
    return 0;
}
cs

이런 식으로 cpp와 h파일을 분할할 수 있습니다. 이러한 분할 방법으로, 가독성을 높일 수 있습니다. 또한, 유지 보수나 더 나은 코드로 업그레이드 할 때도 더 쉽게 접근할 수 있겠습니다.


제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.


공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.

댓글