2024.07.21 - [C++] - C++에서의 구조체
클래스 내에 선언된 변수는 별도의 선언을 하지 않으면 기본적으로 클래스 내에 선언된 함수에서만 접근 가능하다.
따라서 구조체 변수 선언하는 이전 방식인
Car run99={"run99",100,0}; (X)
이 아닌
Car run99; (O)
로 클래스 변수를 선언해야 한다.
초기화 하는 방법은 접근과 관련된 지시를 별도로 내려야한다.
접근제어 지시자
- public : 어디서든 접근허용
- protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용
- private : 클래스 내(클래스 내에 정의된 함수)에서만 접근허용
#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<<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;
}
분할해서 살펴보면
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();
};
클래스 내에서만 접근가능한 private 과 어디서든 public 범위 안에서 접근 가능한 함수들,
접근제어 지시자를 사용하고 있는것을 확인할 수 있다.
void Car::InitMembers(char * ID, int fuel)
{
strcpy(gamerID, ID);
fuelGauge=fuel;
curSpeed=0;
};
새로생긴 함수인 InitMembers()는 클래스 안에 선언된 변수의 초기화를 목적으로 정의되었다.
private 키워드로 선언된 변수들은 main함수에서 접근이 불가능 하기 때문에 이러한 함수를 클래스 내에 선언하였다.
그리고 이 함수는 public으로 선언되어 main함수에서 호출이 가능하다.
따라서 이 함수를 이용해서 main함수에서 클래스 내에 선언된 변수를 초기화 할 수 있다.
int main(void)
{
Car run99;
run99.InitMembers("run99", 100);
run99.Accel();
run99.Accel();
run99.Accel();
run99.ShowCarState();
run99.Break();
run99.ShowCarState();
return 0;
}
초기화를 목적으로 InitMembers함수를 호출하였다. 아래함수들 모두 public 내에 선언되었기때문에 함수호출이 가능하다.
'C++' 카테고리의 다른 글
캡슐화 (Encapsulation) (0) | 2024.07.26 |
---|---|
정보은닉 (Information Hiding) (0) | 2024.07.26 |
C++에서의 구조체 (0) | 2024.07.21 |
이름 공간 (namespace) (2) | 2024.07.17 |
scanf를 대신하는 데이터의 입력 (0) | 2024.07.15 |