도순씨의 코딩일지
C++ :: C++에서의 파일분할 본문
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++ 프로그래밍. 오렌지미디어.
'𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆 > 𝐂++' 카테고리의 다른 글
C++ :: 캡슐화(Encapsulation) (0) | 2020.08.14 |
---|---|
C++:: 정보은닉(Information Hiding) (0) | 2020.08.14 |
C++ :: 이름공간(namespace) (0) | 2020.07.22 |
C++ :: 함수 오버로딩(Function Overloading) & 매개변수의 디폴트값(Default Value) (0) | 2020.07.22 |
C++ :: 입출력 방식 (0) | 2020.07.21 |
Comments