본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 23. static 변수 및 함수

1. static


static 키워드는 변수 혹은 함수 혹은 클래스가 객체(인스턴스) 단위가 아니라 클래스 단위로 생성, 사용되게 하는 키워드이다


msdn의설명에 따르면 static 한정자는 특정 개체가 아니라 해당 형식 자체에 속하는 정적 멤버를 선언하는 데 사용됩니다 라고한다.


무슨의미냐하면..



2. static 변수

지금까지 만든 캐릭터 클래스를 이용해서

캐릭터들을 계속 만들었다.


그런데 내가지금까지 만든 캐릭터의 숫자를 알고싶으면 어떻게 할까?



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
class Character
{
public int num = 0;
public Character()
{
num++;
}


}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
Character luigi = new Character();
Console.WriteLine(mario.num);

}
}
}

뭐 결과는

뻔하겠지만

1이 나온다


맴버 변수로

객체마다 num이 할당되고

num++도 객체마다 이루어지기때문에

mario.num은 당연히 1이나온다 (마리오 생성자는 1번만 불렸으므로)


따라서 기존방식으로는 캐릭터가 총 몇개 생성되었는지 알수없다.


이런한문제를 해결하기위한 키워드가 static이다




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
class Character
{
public static int num = 0;
public Character()
{
num++;
}


}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
Character luigi = new Character();
Console.WriteLine(Character.num);

}
}
}


num을 static 변수로 선언하게되면

이는 이제 객체 (마리오나 루이지) 단위가아닌 클래스(캐릭터 클래스) 단위로 작동하며

사용할때도 Character.num 처럼 클래스명.변수 와 같이 사용한다


따라서 캐릭터의 클래스의 생성자가 불릴떄마다 ++가 되고이는 해당 클래스를 사용하는 전 객체가 공유한다.




3. static함수

static함수도 위의 static변수와 동일한 개념이다.

만약에 객체단위로 움직이는것이 아닌 함수들


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
class Character
{
public static int num = 0;
public Character()
{
num++;
}

public static int CreatedCharacterNumber()
{
return num;
}

}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
Character luigi = new Character();
Console.WriteLine(Character.CreatedCharacterNumber());

}
}
}

요런식이라든가..


아니면 단순 숫자 계산해주는 함수들.. 클래스를 배우기 전에 지금까지 만들었던 함수들...

심지어 main 함수까지 (main은 프로그램 전체에서 1개이어야 하므로..) static 이다.


728x90