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 |