상세 컨텐츠

본문 제목

#7. 정적 변수/함수(Static)

유니티 학습/세미나 자료

by 남민우_ 2024. 7. 29. 22:01

본문

1. Static이란?

 1-1. 예시 상황

오브젝트 'Dog' 를 여러개 만들어놓고 그 총 갯수를 구하고 싶다고 가정해보자.

레벨에 dog 객체를 1, 2, 3 만들었다

실행 코드

public class Dog : MonoBehaviour
{
	public string dogName;
	public float weight;

	private int count = 0;

	void Awake()
	{
		count += 1;
	}
	void Start()
	{
		Debug.Log("내 이름은 : " + dogName);
		Debug.Log("개의 마리수 : " + count);
	}
}

 

 + void Awake() 란,

 Start() 함수와 비슷하게 게임이 시작할 때 시행되는 함수로, Start() 함수보다 한박자 빠른 시점에서 시행된다는 점이 있다.

dog 객체마다 그 특성을 에디터에서 설정해준다

 

시행 결과

객체의 이름을 출력하는 코드가 1번씩, 개의 마리수가 '1'이라고 나타내는 코드가 3번 실행됐다

설정해준 객체의 이름은 정상적으로 출력이 되지만, 개의 총 마리수를 제대로 파악할 수 없다.

 

Why?

개의 마리수를 구하기 위해 선언한 count 변수가 Dog1에서 Dog2로, Dog2에서 Dog3으로 공유되지 않기 때문이다.

=> 이 문제를 해결하려면 Dog1 객체에서 다른 객체의 count 변수를 확인하고, 다른 객체에서 같은 과정을 반복하는 번거롭고 복잡한 과정을 거쳐야 한다.

 

우리는 모든 객체가 같은 count 변수를 사용하여 그 값을 서로 공유할 수 있게 해야 한다.

이런 경우에 사용하는 것이 Static의 개념이다

 

2. Static : 정적

 2-1. 사용 방법

사실 static의 사용 방법 자체는 매우 간단한데, 변수/함수의 이름 앞에 'static' 을 써넣으면 된다

//ex

public static int count = 0;

private static void GetCount() { return count; }

 

이렇게만 해줘도 우리가 처음에 원했던 의도대로 모든 오브젝트가 공유하는 단 하나의 변수/함수 가 생성된다.

 

그림으로 다시 살펴보겠다.

Dog이라는 클래스의 static 변수 count 생성

Dog 클래스에는 name, weight, count 라는 정보가 있지만 그로부터 파생된 객체에서는 name 과 weight 정보밖에 복제하지 못한다.

  => "Dynamic 방식"

 

이에 반해 Static 으로 선언된 count 변수는 정보를 복제하여 가져가는 것이 아니라 Dog Class 로부터 공유하는 개념이다.

  => "Static 방식"

 

초기 코드 수정

private static int count = 0;

 

시행 결과

총 개의 마리수가 3까지 출력된다

이 과정을 통해 우리는 총 개의 마리수가 3마리라는 것을 정상적으로 알 수 있게 되었다.

 

하지만 논리적으로 생각했을 때, 개 스스로가 개의 총 마리수를 안다는 사실이 어색하다.

총 마리수는 개를 관리하는 한 객체만 알고 있어도 되지 않은가?

 

 2-2. 프로젝트의 Static

코드

public class DogManager : MonoBehaviour
{
    
    void Start()
    {
        Debug.Log("총 개의 마리수 : " + Dog.count);
    }

}

//count 변수는 다른 클래스에서도 사용하기 위해 private 에서 public 으로 전환
//Dog 스크립트에서 개의 총 마리수를 알려주는 Debug.Log 는 삭제

 

에디터 설정

DogManager 라는 객체를 만들어서 스크립트를 할당해주었다

 

시행 결과

 

자신의 이름을 말하는 코드와 총 개의 마리수가 나타나는 코드까지 한번씩 정상적으로 작동한다.

 

Q. 코드 중 'Dog.Count' 에 대해서

일반적으로 다른 클래스의 변수/함수를 사용하기 위해서는 클래스 할당을 해주어야 한다.

 ex) public Dog dog; -> dog.count 로 사용 + 에디터 인스펙터 창에서 Dog 스크립트 할당

 

하지만 위 코드에서 count 변수는 이러한 과정 없이 사용이 가능했다.

Dog의 클래스 변수가 모두 그런 것인가? => 아니다!

 ex) Dog.weight 의 경우에는 에러가 발생한다.

 

바로 Static 때문이다.

 

 2-3. Static 의 개념

Static 은 모든 오브젝트가 공유하는, 따라서 프로젝트 전체에서 사용 가능한 단위이다.

Dog 클래스에서 count 변수를 static 으로 선언하면 DogManager 클래스에서도 count 변수를 사용할 수 있기에 굳이 객체 할당 과정을 거쳐야 할 이유가 사라지는 것이다.

 

추가적으로, 지난 과정에서 배운 'Overload'와 static 은 혼용이 가능하다.

public static void Sum(int a, int b) { }

public static void Sum(int a, int b, int c) { }

'유니티 학습 > 세미나 자료' 카테고리의 다른 글

#9. 싱글톤(Singleton)  (0) 2024.07.31
#8. 리스트(List)  (0) 2024.07.30
#6. 오버로드(Overload)  (0) 2024.07.28
#5. 인스턴스(Instance)  (0) 2024.07.24
#4. 벡터 연산  (5) 2024.07.24

관련글 더보기