Static(정적)
- 필드 or 메소드가 인스턴스가 아닌 클래스 자체에 소속되도록 함
- 클래스 자체에 소속되므로 단 한 개만 존재
- static 변수 + static 함수
- 클래스 명을 통한 접근[객체 접근 X]
- 메모리에 고정됨
- C#의 경우 정적 필드를 사용할 때, Heap 영역에 동적 메모리 할당(C언어와 다름: C언어는 시작 순간 메모리 할당)
public class Monster{
public static int score = 0;
public static Func(...){ ... }
}
private void Start(){
Monster.score++;
Monster.Func(...);
}
- static 메소드 내부에서는 static이 아닌 멤버(함수 or 변수) 사용불가
- 객체 소속이 아닌 클래스 소속이므로, 객체의 소속 멤버를 사용할 수 없는 의미
Static 클래스
- MonoBehaviour 상속 불가
- static 함수 / 변수만 선언 및 호출 가능
- 처음 호출되었을 때, 메모리 할당
public static class Test
{
static int age = 10;
public static void StaticFunc() Debug.Log("StaticFunc");
}
static 클래스 사용처 : 확장 메소드
- 확장 메소드
- static 함수를 클래스명 접근이 아닌 내가 원하는 타입을 통한 접근을 하도록 만들어줌
- 인자에 (this 내가 원하는 타입명) 추가
public static class StringExtensions
{
public static bool IsNumeric(this string s)
{
float output;
return float.TryParse(s, out output);
}
}
public static class TransformExtensions
{
public static void SetPositionX(this Transform transform, float x)
{
var newPosition = new Vector3(x, transform.y, transform.position.z);
transform.position = newPosition;
}
}
void Start()
{
transform.SetPositionX(4f);
}
Singleton(싱글톤)
- 싱글톤 클래스: 클래스의 인스턴스(객체)가 단 하나만 존재하도록 보장하는 클래스
public class Test : MonoBehaviour
{
public static Test Inst { get; private set; }
void Awake()
{
if(Inst == null)
{
Inst = this;
DontDestroyOnLoad(gameObject);
}
else Destroy(gameObject);
}
싱글톤 접근
void Start()
{
Test.Inst.age = 3;
}
public 클래스 static 함수
public class Test : MonoBehaviour
{
public static Test Inst { get; private set; }
void Awake() => Inst = this;
public int age;
public int birth;
public static void TesetFunc(){
Inst.age = 3;
Inst.birth = 1996;
Debug.Log("TestFunc 호출");
}
void _TestFunc(){
birth = 1996;
Debug.Log("TestFunc 호출");
}
}
static 생략법
- static 시, 코드를 줄이는 여러 방법 소개
using static
- static 함수를 코드 선언에서 생략하고 싶은 경우 사용[추천X]
using static Debug;
Log("Debug 생략");
싱글톤 Property
- 싱글톤 구현 시, static property로 구현하면 코드 단축 가능
public class Test : MonoBehaviour
{
public static Test Inst { get; private set; }
void Awake() => Inst = this;
[SerializeField] int age;
public static int Age { get => Inst.age; set => Inst.age = value; }
}
모노싱글톤 : MonoSingleton
- 싱글톤 패턴을 쉽게 구현하게 해주는 클래스
- 구현법(GameManager.cs)
public class GameManager : MonoSingleton<GameManager>
{
public void Click()
{
print("click");
}
}
public class Test : MonoBehaviour
{
void Start()
{
GameManager.Inst.Click();
}
}