예제
class Player
{
public int At = 10;
Public int Hp = 100;
public void Setting(int _AT, int _HP)
{
At = _AT;
Hp = _HP;
}
}
class Program
{
static void Main(string[] args)
{
Player newPlayer1 = new Player();
Player newPlayer2 = new Player();
Player newPlayer3 = new Player();
newPlayer1.Setting(10,100);
newPlayer2.Setting(20,50);
newPlayer3.Setting(100,500);
}
}
- Player 클래스를 3번 new 했기에 객체화가 된 객체가 3개 존재한다. 3개 모두 값이 해당 클래스의 멤버함수를 호출한 값 대로 나왔다. newPlayer1 -> 10,100 , newPlayer2 -> 20 ,50
newPlayer3 -> 100,500



즉, 위 과정을 통해 클래스의 멤버변수(AT,HP)는 각각 존재한다.
Player 클래스에 static 변수(정적 변수)를 선언하면 ??
예제
class Player
{
public static int PlayerCount = 0;
public int At = 10;
Public int Hp = 100;
public void Setting(int _AT, int _HP)
{
At = _AT;
Hp = _HP;
}
}
class Program
{
static void Main(string[] args)
{
Player newPlayer1 = new Player();
Player.PlayerCount = 1; //이런식으로 클래스 이름에 접근하여 바로 사용할 수 있음.
Player newPlayer2 = new Player();
Player.PlayerCount = 2;
Player newPlayer3 = new Player();
Player.PlayerCount = 3;
newPlayer1.Setting(10,100);
newPlayer2.Setting(20,50);
newPlayer3.Setting(100,500);
}
}
- 일반 멤버 변수와 다른점은 자료형 앞에 static 키워드를 붙인다.
- 이 멤버 변수는 일반 멤버 변수가 아닌 정적 멤버 변수이다.
- 이 정적 멤버 변수는 객체화를 하지 않고도 사용할 수 있다. -> 즉, 클래스의 이름을 접근하여 사용할 수 있다.
- newPlayer1.PlayerCount 사용 불가 -> Player.PlayerCount
- 이 정적 멤버 변수는 스택 영역이 아닌 데이터 영역에 존재하게 된다.

클래스 내부 안에서 정적 멤버 변수를 사용할 수 있다.
class Player
{
public static int PlayerCount = 0;
public void Setting(int _ap , int _hp)
{
PlayerCount = 100;
}
}
class Program
{
static void Main(string[] args)
{
Player newPlayer1 = new Player();
Player newPlayer2 = new Player();
Player newPlayer3 = new Player();
newPlayer1.Setting(10,20); //PlayerCount = 100
newPlayer2.Setting(30,50); //PlayerCount = 100
newPlayer3.Setting(50,60); // PlayerCount = 100
}
}
- 어떤 클래스가 공유하고 싶은 값.
- PlayerCOunt의 값을 바꾸기 전까지 해당 값은 유지가 된다.
- 멤버 함수 호출 시 스택영역에 만들어지는 지역변수(_ap,_hp)들은 각 객체(newPlayer1,newPlayer2,newPlayer3)마다 존재한다. 그럼 _ap의 개수는 3개, _hp의 개수는 3개이다(총 3쌍). 하지만, 정적 멤버 변수(PlayerCount)는 단 1개이다.

예제
class Monster
{
public int DeathCount = 0;
public void Death()
{
DeathCount += 1;
}
}
class Program
{
static void Main(string[] args)
{
Monster monster1 = new Monster();
Monster monster2 = new Monster();
Monster monster3 = new Monster();
monster1.Death();
monster2.Death();
monster3.Death();
}
- 몬스터1,2,3 이 Death() 호출로 인해 -> DeathCount가 3이 되어야 함.
- Death()를 객체마다 호출 했을 때, DeathCount는 항상 1이된다.
- 왜냐하면, Monster 객체화를 3번하였고, 그 객체 마다 DeathCount가 존재한다. 즉, DeathCount가 3개 존재함.

그럼 어떻게 할건데??
- DeathCount가 객체별로 1개씩 존재하는 것이 아니라, 딱 1개만 존재하게끔 해야 한다. 지역 변수가 아닌 정적 멤버 변수로 존재하게 해야 한다.

- 모든 객체가 값을 공유할 필요가 있는 데이터를 정의하는데 사용한다.
