C++

01. class(class 기본, Get, Set함수)

Honyack 2023. 11. 10. 18:00

class는 변수와 함수로 구성된 데이터로

하나의 설계도이다.

설계도로 나온 물건을 객체 라고 하고

설계도를 이용해 여려가지 객체를 만들 수 있다.

라고 정의 되어있다.

 

그래서 클래스를 사용하는 이유가 뭐지?

나는  class를 우리가 조금더 쉽게 이해할수 있도록 

분류할수있는 상자라고 생각한다.

 

 그래서 클래스 없이도 클래스가 있는것처럼 정의하고 사용할수있지만

그렇게되면 우리의 뇌의 인식이 여려워진다.

class Player
{
	int age;
	int hp;
};

class Enemy
{
	int AttackDamage;
	int hp;
};

class Npc
{
	int QuestCount;
	bool Alive;
};

▲클래스를 사용했을때

 

	int NpcQuestCount;
	int Playerage;
	int EnemyAttackDamage;
	bool NpcAlive;
	int Playerhp;
	int Enemyhp;

▲클래스를 사용하지 않았을때

 

그냥 변수선언만 했을뿐인데 벌써 복잡한데

값을 수정하고 여러 함수와 얽히고 설키다보면 너무 복잡해진다.

이러한 문제를 class를 사용해 박스단위로 분류하고

 

덤으로 재사용도 할수있다.

 

class 정의

기본적으로 class 도 struct와 비슷해서 

struct와 똑같이 정의하면 되지만

 

약간의 다른 점 중 하나는

접근 지정자

이다.

 

접근지정자

public - 누구나 접근가능

private - class 내에서만 접근가능

protected - class내, 상속 클래스에서만 접근가능

 

struct는 기본 public 

class는 기본 private 

이기 때문에 클래스 외부에서는 접근이 불가능하다.

 

접근지정자를 public으로 하면 해당 변수에 접근이 가능하다.

 

하지만 직접적으로 변수에 접근하는 것은 큰 실수를 일으킬 수 있다.

그래서 Set함수 Get함수로 값을 간접적으로 저장하고 받아온다.

#include <iostream>
using namespace std;

class Player
{
private:
	int hp;
public:
	void SetHp(int num)
	{
		hp = num;
	}
	int GetHp()
	{
		return hp;
	}
};
int main()
{
	Player player; 
	
	player.SetHp(10);
	int PlayerHp = player.GetHp();

	cout << "플레이어 HP:" << PlayerHp << endl;
	return 0;
}

 

실행 결과

 

아직은 크게 필요성을 못 느끼겠으니 다른 코드를 보자

class Player
{
public:
	int age;
};

int main()
{
	Player player; 
	cin >> player.age;
	
	cout << "플레이어의 나이:" << player.age << endl;


	return 0;
}

사용자의 입력을 받아 플레이어의 나이를 저장하고 

출력하였다. 

 

 

-99를 입력하니 플레이어의 나이가 -99로 저장된 것을 볼 수 있다.

함수를 사용하면 이런 터무니없는 입력이나 실수를 방어할 수 있다.

 

아래는 함수를 사용하여 값입력이 잘못되면 다시 입력하도록 작성하였다.

class Player
{
	int age;
public:
	void SetAge(int age_)
	{
		if (age_ < 1)
		{
			age = 1;
		}else if (200 < age_)
		{
			age = 200;
		}
		else
		{
			age = age_;
		}

	}
	int GetAge() { return age; }
};

int main()
{
	Player player; 
	
	 int age;
	 cin >> age;

	 player.SetAge(age);
	 cout << "플레이어의 나이:" << player.GetAge() << endl;

	return 0;
}

아까랑 똑같이 입력했지만 방어 코드로 값이 마이너스가 되지는 않았다.

 

class Player
{
	int Hp;
public:
	void SetHp(int hp) { Hp = hp; }
	int GetHp() { return Hp; }

	void Attacked(int damage)
	{
		if (Hp - damage < 0)
			Hp = 0;
	}
};

int main()
{
	Player player; 
	player.SetHp(5);

	player.Attacked(100);
	cout<<"플레이어의 체력:"<<player.GetHp() << endl;

	return 0;
}

이번에는 플레이어 체력이 5인 상태에서

체력보다 더 큰 대미지를 받으면 마이너스 값이 아니라 0이 되도록 하였다.

 

 

'C++' 카테고리의 다른 글

스마트 포인터  (0) 2024.03.12
함수 포인터(다양한 방법)  (0) 2024.03.12
04. namespace  (0) 2023.11.17
03. class(상속)  (0) 2023.11.10
02. class(생성자, 소멸자)  (0) 2023.11.10