- static 은 변수나 메소드에 키워드로 사용된다.
- static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성된다.
(스태틱 변수는 객체 선언과 동시에 메모리가 할당이 되며 일반 변수들이 객체가 새로 생성 될 때에 메모리가 초기화 되는 것과 다르게 해당 객체를 반복생성 하더라도 메모리가 유지된다는 특징이 있다.) -> C# static은 처음부터 로드되지 않으며, 그 static 타입이 처음으로 사용될 때 초기화되어 계속 동일한 메모리를 사용
- 인스턴스를 생성하지 않아도 바로 사용이 가능하다.(편리하고 속도가 빠르다는 장점)
-> 프로그램 내에서 공통으로 사용되는 데이터를 관리할 때에 용이함
- static 키워드는 변수, 함수 혹은 클래스가 객체(인스턴스) 단위가 아니라 클래스 단위로 생성, 사용되게 하는 키워드이다.
- static 으로 선언된 변수는 값이 초기화되면 해당클래스를 사용하는 전 객체가 공유된다.
언뜻 보기에 static은 사용하기에도 편하고 효율적인 것처럼 보이지만 "정적 변수는 무슨일이 있더라도 피하라" 라는 말이 있다. static을 권장하지 않는 이유로는
1. 전체 프로그램과 동일한 라이프사이클
-static 멤버는 사용을 하던 사용하지 않던 프로그램의 시작과 끝까지 메모리 내에 존재한다
2. static 변수의 생성과 소멸을 지시할 수 없음
-프로그램이 로딩될 때 생성되고, 프로그램이 종료될 때 소멸된다(개발자가 프로그램적으로 생성과 소멸에 관여할 수 없음)
3. thread safe하지 않음
-한 곳에서 값을 변경할 경우 다른 곳에서 영향을 받는다. 이는 동시성 문제를 야기한다.
4. static 메서드는 오버라이딩 불가
5. static 멤버는 Serialization 불가
-객체 직렬화는 인스턴스에 대해 적용되기 때문에 클래스 자체 정보인 static 멤버는 여기에 포함되지 않는다.
6. 런타임 다형성 불가
7. 메모리 문제
-static 멤버는 프로그램이 종료될 때까지 Garbage Collector로 회수되지 않기 때문에, 많은 수의 static 필드나 메서드가 존재할 경우 메모리에 영향을 미친다.
8. 테스트하기 어려움
-static 필드는 전역으로 관리되기 때문에 프로그램 전체에서 이 필드에 접근할 수 있고 변경할 수 있으므로 해당 필드를 추론하기 어려워 테스트하기가 까다롭다.
위와 같은 문제로 왠만한 경우에서는 정적변수를 사용하지 않는 것이 좋지만 어떤 경우에서 사용하면 좋을지 알아보자면 여러 스크립트의 Awake() 혹은 Start()에서 종종 반복적으로 사용되는 게임 오브젝트나 컴포넌트의 참조를 저장할 때 사용하는 것을 추천한다.
또한, 게임 점수, 플레이어의 체력, 게임의 상태(playing, paused, game over), 플레이어의 상태(alive, dead) 와 같은 게임 룰에 관련된 기본형 변수에서 사용하는 것이 좋은 예가 될 수 있다.