일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Classification
- 분류
- LG Aimers 4th
- regression
- Machine Learning
- PCA
- LLM
- gpt
- AI
- 오블완
- 지도학습
- 회귀
- LG Aimers
- 머신러닝
- deep learning
- 딥러닝
- 티스토리챌린지
- GPT-4
- 해커톤
- supervised learning
- ChatGPT
- OpenAI
- LG
- Today
- Total
SYDev
C++ Chapter 03-2 : 클래스(Class)와 객체(Object)(2) 본문
C++에서의 파일 분할
지난 글에서는 클래스를 선언, 정의하고 접근제어 지시자를 설정하는 법에 대해서 배웠다. 그렇다면 우리는 이 클래스의 선언과 정의(멤버함수의 정의)를 한 파일에 담지 않고 분할해서 배치할 필요가 있다.
#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<<"km/s"<<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;
}
지난 게시글에서 살펴봤던 클래스의 예제이다.
클래스의 선언(declaration)
해당 클래스에서 '클래스의 선언(declaration)' 파일은 다음과 같이 나눌 수 있다.
파일명 : Car.h
#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
'클래스의 선언' 부분은 컴파일러가 클래스와 관련된 오류를 잡아내기 위해 필요한 최소한의 정보이다. 해당 정보는 클래스와 관련된 문장의 옳고 그름을 판단하는데 필수적이다.
#ifndef ~ #endif
새로 추가된 개념으로 #ifndef ~ #endif가 있는데 이는 헤더파일 include의 중복을 미연에 방지하고 사용한다. 예를 들어서 헤더파일이 head1.h, head2.h가 있는데 head2.h가 head1.h를 include한다고 가정해보자. 그렇다면 head1.h와 head2.h를 모두 include 했을 때 head1.h가 두 번 include 된 것과 마찬가지가 된다. 이럴 경우에 include에 선언된 변수 혹은 함수가 두 번 선언된 것이 되고, 오류가 발생한다. 이때 #ifndef, #define, #endif 구문을 이용하는데, #define 내용이 이미 실행되었으면 이후에 중복으로 실행되지 않는다.
클래스의 정의(definition)
'클래스의 정의(definition)'에 해당하는 파트는 다음과 같다.
파일명 : Car.cpp
#include <iostream>
#include <cstring>
#include "Car.h" // header파일을 include하지 않으면 클래스가 선언한 함수, 변수를 사용할 수 없다.
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<<"km/s"<<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;
}
'클래스의 정의'에 해당하는 부분은 다른 문장의 컴파일에 필요한 정보를 가지고 있지 않기 때문에 컴파일된 이후에 링커에 의해 하나의 실행파일로 묶이기만 하면 된다.
마지막으로 main 함수가 포함되는 main 파일은 다음과 같다.
파일명 : RacingMain.cpp
#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;
}
참고자료
- 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12
'Programming Lang > C++' 카테고리의 다른 글
C++ Chapter 03-2 : 객체지향 프로그래밍의 이해 (0) | 2023.07.13 |
---|---|
C++ Chapter 03-2 : 클래스(Class)와 객체(Object)(3) (0) | 2023.07.13 |
C++ Chapter 03-2 : 클래스(Class)와 객체(Object)(1) (0) | 2023.07.12 |
C++ Chapter 03-1 : C++에서의 구조체 (0) | 2023.07.12 |
C++ Chapter 02-6 : C++에서 C언어의 표준함수 호출하기 (0) | 2023.07.11 |