도순씨의 코딩일지

C++ :: C++에서의 파일분할 본문

𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆/𝐂++

C++ :: C++에서의 파일분할

도순씨 2020. 8. 13. 12:00

C++은 클래스 별로 헤더파일과 소스 파일을 생성하기 때문에 많은 수의 파일이 만들어집니다. 파일분할은 다음과 같은 기준으로 나누어집니다.

 

💡 ~.h : 클래스의 선언을 담는다
💡 ~.cpp: 클래스의 정의 (멤버함수의 정의)를 담는다

 

클래스의 선언은 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
class Car{
private:
    char gamerID[CAR_CONST :: ID_LEN];
    int fuelGauge;
    int curSpeed;
public:
    void InitMembers(char * ID, int fuel);
    void ShowCarState();
    void Accel();
    void Break();
};
cs

위의 코드들은 클래스와 관련된 오류를 잡아내는데 필요한 최소한의 정보입니다. 이를 클래스의 선언(declaration)이라 합니다. 

 

반면 클래스의 정의(definition)에 해당하는 다음 함수들의 정의는 다른 문장의 컴파일에 필요한 정보를 가지고 있습니다. 따라서 함수의 정의는 컴파일이 된 이후에, 링커에 의해 하나의 실행파일로 묶이기만 하면 됩니다.

 

먼저 코드를 하나의 파일로 작성하면 다음과 같이 작성할 수 있습니다.

 

⭐️ 코드

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>
#include <cstring>
using namespace std;
 
namespace CAR_CONST{
    enum{
        ID_LEN = 20, MAX_SPD = 200, FUEL_STEP = 2,
        ACC_STEP = 10, BRK_STEP = 10
    };
}
 
class Car{
private:
    char gamerID[CAR_CONST::ID_LEN];
    int fuelGauge;
    int curSpeed;
public:
    void InitMembers(char * ID, int fuel);
    void ShowCarState();
    void Accel();
    void Break();
};
 
void Car::InitMembers(char *ID, int fuel) {
    strcpy(gamerID, ID);
    fuelGauge = fuel;
    curSpeed = 0;
}
 
void Car::ShowCarState() {
    cout<<"소유자ID: "<<gamerID<<endl;
    cout<<"연료량: "<<fuelGauge<<endl;
    cout<<"현재속도: "<<curSpeed<<endl<<endl;
}
 
void Car::Accel() {
    if(fuelGauge <= 0)
        return;
    else
        fuelGauge = CAR_CONST::FUEL_STEP;
    if((curSpeed+CAR_CONST::ACC_STEP) >= CAR_CONST::MAX_SPD){
        curSpeed = CAR_CONST::MAX_SPD;
        return;
    }
    curSpeed += CAR_CONST::ACC_STEP;
}
 
void Car::Break() {
    if(curSpeed < CAR_CONST::BRK_STEP){
        curSpeed = 0;
        return;
    }
    curSpeed -= CAR_CONST::BRK_STEP;
}
 
int main(void){
    Car run99;
    run99.InitMembers("run99"100);
    run99.Accel();
    run99.Accel();
    run99.Accel();
    run99.ShowCarState();
    run99.Break();
    run99.ShowCarState();
    return 0;
}
cs

 

⭐️ 실행 결과

1
2
3
4
5
6
7
소유자ID: run99
연료량: 2
현재속도: 30
 
소유자ID: run99
연료량: 2
현재속도: 20
cs

 

위에서 언급한 클래스의 선언과 클래스의 정의를 활용하여 파일로 세 개로 나눈 것은 다음과 같습니다.

 

⭐️ Car.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef __CAR_H__
#define __CAR_H__
 
namespace CAR_CONST{
    enum{
        ID_LEN = 20, MAX_SPD = 200, FUEL_STEP = 2,
        ACC_STEP = 10, BRK_STEP = 10
    };
}
class Car{
private:
    char gamerID[CAR_CONST::ID_LEN];
    int fuelGauge;
    int curSpeed;
public:
    void InitMembers(char * ID, int fuel);
    void ShowCarState();
    void Accel();
    void Break();
};
 
#endif
cs

여기서 익숙하지 않은 것(?) 들을 볼 수 있습니다. #ifndef는 'if not defined'의 약자로써 위 코드에서는 __CAR_H__를 #define으로 정의하지 않았다면 #endif 이전의 내용을 포함시키라는 뜻입니다.

 

⭐️ Car.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
#include <iostream>
#include <cstring>
#include "Car.h"
using namespace std;
 
void Car::InitMembers(char *ID, int fuel) {
    strcpy(gamerID, ID);
    fuelGauge = fuel;
    curSpeed = 0;
}
void Car::ShowCarState() {
    cout<<"소유자ID: "<<gamerID<<endl;
    cout<<"연료량: "<<fuelGauge<<endl;
    cout<<"현재속도: "<<curSpeed<<endl<<endl;
}
void Car::Accel() {
    if(fuelGauge <= 0)
        return;
    else
        fuelGauge = CAR_CONST::FUEL_STEP;
    if((curSpeed+CAR_CONST::ACC_STEP) >= CAR_CONST::MAX_SPD){
        curSpeed = CAR_CONST::MAX_SPD;
        return;
    }
    curSpeed += CAR_CONST::ACC_STEP;
}
void Car::Break() {
    if(curSpeed < CAR_CONST::BRK_STEP){
        curSpeed = 0;
        return;
    }
    curSpeed -= CAR_CONST::BRK_STEP;
}
cs

 

⭐️ RacingMain.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "Car.h"
 
int main(void){
    Car run99;
    run99.InitMembers("run99"100);
    run99.Accel();
    run99.Accel();
    run99.Accel();
    run99.ShowCarState();
    run99.Break();
    run99.ShowCarState();
    return 0;
}
cs

 

 

📜 출처

윤성우(2010). 윤성우 열혈 C++ 프로그래밍. 오렌지미디어.

 

Comments