그 동안 프로그래밍을 할 때 무의식적으로 static을 써왔는데 개념을 간단히 이해만 하고 넘어가보려한다.
class Knight
{
static public int counter;
public int id;
public int hp;
public int attack;
static public Knight CreateKnight()
{
Knight knight = new Knight();
knight.hp = 100;
knight.attack = 10;
return knight;
}
public Knight()
{
id = counter;
counter++;
hp= 100;
attack =10;
Console.WriteLine("생성자 호출");
}
public Move()
{
//Move
}
}
static void Main(string[] args)
{
// 메인
Knight knight = Knight.CreateKnight(); // 클래스 static 함수 호출
knight.Move(); // 객체 종속적 함수 호출
Console.WriteLine();
}
class Knight 에 선언된 static public int counter을 보자면 static이 붙어있으니 클래스 Knight 자체에 종속적인 변수라고 보면 되고
그냥 public int로 선언된 필드 변수들은 클래스 Knight가 만들어 내는 객체들 (knight1,knight2...)들에 종속적인 변수라고 보면 된다.
여기서 static public Knight CreateKnight() 함수를 보자면 클래스 Knight의 필드 변수(id,hp,attack)과 같은 객체종속적인 변수에는 함부로 접근할 수 없다. 어떤 객체의 id,hp,attack인지 알수없기 때문이다. 그러므로 같은 static 변수로 선언된 counter에만 접근할 수 있고 여기서 새로운 Knight를 만드는 함수로 선언하였기 때문에 knight라는 객체를 만들어서 hp , attack에 접근하여 반환하는것을 볼 수 있다.
메인함수에서도 static 함수를 호출하려면 클래스에 종속적이니 Knight.CreateKnight() 로 호출하는 것을 볼 수 있고 Move함수는 객체종속적이니 knight라는 객체 knight.Move()로 호출 할 수 있다.
우리가 그동안 사용해왔던 Console.WriteLine()도 보자면 Console 클래스에 WriteLine이 static 함수로 선언되어있다는 것을 알수있다.