C# - static

윤형·2025년 1월 19일
0

Unity

목록 보기
7/8

서론

저번에 배운 메모리 구조에서 좀더 확장해서 오늘은 static이라는 정적 프로그래밍에 대해서 다뤄보도록 하겠다. 사실 게임 개발을 하다보면 자주 사용하는 것이라 익숙할 것이다.

Static

클래스 자체에 소속되게 함, 메모리에 고정

public class Monster
{
	public static int score = 0;
    public void Dead(){
    	score ++;
    }
}

public void Start(){
	Monster monster1 = new Monster();
    Monster monster2 = new Monster();
    
    monster1.Dead();
    monster2.Dead();
    
    Debug.Log(Monster.score);
}

이렇게 코드를 작성하면 생성된 Monster 인스턴스틑 힙 메모리에 저장이 되고, 그걸 참조하는 monster1은 스택 메모리에 저장이 되는것을 지난시간에 배웠다.
그렇다면 우리가 클래스 안에 작성해둔 멤버들은 (메서드 + 필드) 생성된 인스턴스 안에 저장이 되어있을 것이다. 하지만 static 을 사용하게 되면 힙 메모리 전체에 static 값이 메모리에 고정이 되어, 인스턴스끼리 공유할 수 있게 된다. 또한 힙 메모리에 고정적으로 남아있게 되기 때문에 다른 코드 블록안에서도 호출해서 사용할 수 있다.

+) 필드 : 클래스나 객체의 속성을 나타냄, 클래스의 모든 인스턴스에서 공유 가능 -> 변수와 유사하지만 그 범위가 살짝 다르기 때문에 확실히 하고 넘어가야한다.

싱글톤

이러한 static 기능을 이용하면 싱글톤을 만들 수 있다. 싱글톤은 그 클래스의 인스턴스가 하나만 존재할 수 있게 하는 것이다.

public class Test{
	public static Test instance = new Test();
    private Test() {}
    
    public void TestMethod1(){}
    public void TestMethod2(){}
}

이런식으로 외부에서는 인스턴스를 만드는 것을 막으면서 static을 통해 전역으로 이 인스턴스를 호출할 수 있게 해주는 것이다.
이 싱글톤은 유일하게 만들어 주기 때문에 여러 Manager클래스를 만들고 관리할때 거의 필수적으로 사용된다.

정적 메서드

지금까지는 정적 클래스에 관한 이야기였다. 그렇다면 정적 메서드들은 어떤 식으로 활용될 수 있을까?

public class Util
{
	public static void FindOBJ(string _name){
    	GameObject go = GameObject.Find(_name);
        return go;
    }
    
   ,,,
}

이런식으로 자주 사용되는 기능을 API처럼 만들어서 전역적으로 사용할 수 있다. 우리가 자주 사용하는 Debug.Log()도 타고 들어가보면 Debug클래스 안에 Log라는 정적 메서드가 선언되어있는 것을 볼 수 있다.

profile
제가 관심있고 공부하고 싶은걸 정리하는 저만의 노트입니다.

1개의 댓글

comment-user-thumbnail
2025년 1월 21일

대단하십니다 볼 때마다 경이로워요! 정진하는 모습 is good~ bb

답글 달기