[Unity/C#]static과 singleton

강동현·2024년 1월 1일
0

Unity/C#

목록 보기
9/26

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;
    //int birth = 2012;//에러
    public static void StaticFunc() Debug.Log("StaticFunc");
    //public void Func() Debug.Log("Func"); //에러
}

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);
}

싱글톤 접근

  • 생성된 Inst 객체를 통한 접근
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");
    }
}
  • 사용법(Test.cs)
public class Test : MonoBehaviour
{
	void Start()
    {
    	GameManager.Inst.Click();
    }
}
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글