본문 바로가기
C++

클래스 (class)

by KWONE 2024. 7. 22.

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