오늘은 Static에 대해서 알아보려고 합니다.
프로그램 내부에서 프로그래머가 메모리 공간을 빌려달라고 요청하면 임의의 공간이 할당되고, 우리가 사용하고자 하는 데이터를 보관하고, 사용이 끝났다면 할당을 해제하는 방식
즉, int에 저장해 달라고하면 저장해주는 방식 생각하시면 됩니다.
보통 클래스나 배열 같은 경우, 힙 메모리에 할당되기 때문에 프로그램 실행 중에도 상황에 따라 저장된 위치가 내부적으로 바뀌는 동적인 모습을 보입니다.
프로그램이 종료될 때 까지 한 공간을 고정적으로 차지하는 정적인 개념을 Static이라고 합니다.
class Setting
{
public static int volume = 100; // Static 선언
}
Static은 메모리에 데이터 영역에 저장하고 프로그램 시작부터 끝까지 유지하기 때문에
프로그램 시작부터 끝까지 유지가 꼭 필요한 데이터(ex 사운드, 밝기)에 사용한다.
또 어디서든 가져다가 쓸 수 있어 전역적인 접근이 가능한 특징을 가지고 있습니다.
static을 사용하는데 주의해야 하는 점은 몬스터 체력을 구성할 때 몬스터 마다 체력감소가 달라야 하는데 static으로 선언을 하면 체력이 공유되는 문제가 생길 수 있고 데이터가 처음부터 끝까지 유지되기 때문에 메모리를 많이 잡아먹어서 많이 사용하면 안된다.
class Monster
{
public static int hp = 100;
public void TakeDamage(int damage)
{
hp -= damage;
Console.WriteLine("몬스터 체력은 {0}", hp);
}
}
static void Main(string[] args)
{
// temp = 20; // 블록 바깥에서 사용 불가
Monster monster = new Monster();
Monster monster2 = new Monster();
monster.TakeDamage(10);
monster2.TakeDamage(10);
}
몬스터 체력은 90
몬스터 체력은 80
위 코드 결과를 보면 보면 데이터가 공유되어 다른 몬스터인데도 중첩되서 깎인 결과가 나온다!
class Monster
{
public int hp = 100;
public void TakeDamage(int damage)
{
hp -= damage;
Console.WriteLine("몬스터 체력은 {0}", hp);
}
}
static void Main(string[] args)
{
// temp = 20; // 블록 바깥에서 사용 불가
Monster monster = new Monster();
Monster monster2 = new Monster();
monster.TakeDamage(10);
monster2.TakeDamage(10);
}
몬스터 체력은 90
몬스터 체력은 90
따라서 static이 꼭 필요한 경우에만 사용하자!