Chapter 12. 멤버함수 - Part3

개발하는 운동인·2025년 10월 7일

예제

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개만 존재하게끔 해야 한다. 지역 변수가 아닌 정적 멤버 변수로 존재하게 해야 한다.
  • 모든 객체가 값을 공유할 필요가 있는 데이터를 정의하는데 사용한다.

0개의 댓글