오브젝트 'Dog' 를 여러개 만들어놓고 그 총 갯수를 구하고 싶다고 가정해보자.
실행 코드
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() 함수보다 한박자 빠른 시점에서 시행된다는 점이 있다.
시행 결과
설정해준 객체의 이름은 정상적으로 출력이 되지만, 개의 총 마리수를 제대로 파악할 수 없다.
Why?
개의 마리수를 구하기 위해 선언한 count 변수가 Dog1에서 Dog2로, Dog2에서 Dog3으로 공유되지 않기 때문이다.
=> 이 문제를 해결하려면 Dog1 객체에서 다른 객체의 count 변수를 확인하고, 다른 객체에서 같은 과정을 반복하는 번거롭고 복잡한 과정을 거쳐야 한다.
우리는 모든 객체가 같은 count 변수를 사용하여 그 값을 서로 공유할 수 있게 해야 한다.
이런 경우에 사용하는 것이 Static의 개념이다
사실 static의 사용 방법 자체는 매우 간단한데, 변수/함수의 이름 앞에 'static' 을 써넣으면 된다
//ex
public static int count = 0;
private static void GetCount() { return count; }
이렇게만 해줘도 우리가 처음에 원했던 의도대로 모든 오브젝트가 공유하는 단 하나의 변수/함수 가 생성된다.
그림으로 다시 살펴보겠다.
Dog 클래스에는 name, weight, count 라는 정보가 있지만 그로부터 파생된 객체에서는 name 과 weight 정보밖에 복제하지 못한다.
=> "Dynamic 방식"
이에 반해 Static 으로 선언된 count 변수는 정보를 복제하여 가져가는 것이 아니라 Dog Class 로부터 공유하는 개념이다.
=> "Static 방식"
초기 코드 수정
private static int count = 0;
시행 결과
이 과정을 통해 우리는 총 개의 마리수가 3마리라는 것을 정상적으로 알 수 있게 되었다.
하지만 논리적으로 생각했을 때, 개 스스로가 개의 총 마리수를 안다는 사실이 어색하다.
총 마리수는 개를 관리하는 한 객체만 알고 있어도 되지 않은가?
코드
public class DogManager : MonoBehaviour
{
void Start()
{
Debug.Log("총 개의 마리수 : " + Dog.count);
}
}
//count 변수는 다른 클래스에서도 사용하기 위해 private 에서 public 으로 전환
//Dog 스크립트에서 개의 총 마리수를 알려주는 Debug.Log 는 삭제
에디터 설정
시행 결과
자신의 이름을 말하는 코드와 총 개의 마리수가 나타나는 코드까지 한번씩 정상적으로 작동한다.
Q. 코드 중 'Dog.Count' 에 대해서
일반적으로 다른 클래스의 변수/함수를 사용하기 위해서는 클래스 할당을 해주어야 한다.
ex) public Dog dog; -> dog.count 로 사용 + 에디터 인스펙터 창에서 Dog 스크립트 할당
하지만 위 코드에서 count 변수는 이러한 과정 없이 사용이 가능했다.
Dog의 클래스 변수가 모두 그런 것인가? => 아니다!
ex) Dog.weight 의 경우에는 에러가 발생한다.
바로 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 |