static.. Dynamic의 반대로 알고 있다.
정적을 의미한다.
즉, 런타임 이전에 훨씬 이전에 수행되어 만들어진다는 뜻으로 알고 있다.
사실 선언했을 때 만들어진다.
** 메모리에서의 Data에 저장된다.
그럼
유니티에서 Static의 의미를 알아보자
static은 Data 영역에 저장되기 때문에 변수를 수정하거나, 읽을 때, 클래스 객체를 만들 필요가 없다.
아무리 객체를 만들더라도 static은 유일하게 존재한다.
using UnityEngine;
using System.Collections;
public class Enemy
{
//Static variables 은 모든 클래스의 인스턴스와 공유된다.
public static int enemyCount = 0;
public Enemy()
{
//이렇게 함으로써 이 클래스로 만들어진 객체가 얼마나 많은지 알 수 있다.
// 각 객체에 enemyCount 를 가지고 있겠지만
// 각 객체는 같은 값을 가리킬 수 밖에.. stack영역의 enemyCount를 가리킨다.
enemyCount++;
}
}
만약 아래와 같은 코드라면??
using UnityEngine;
using System.Collections;
public class Game
{
void Start ()
{
Enemy enemy1 = new Enemy(); // 객체 생성
Enemy enemy2 = new Enemy(); // 2
Enemy enemy3 = new Enemy(); // 3
// 또한 언제든지 static variable에 접근이 가능하다.
// "클래스 이름"과 "." 만 있으면 가능하다
int x = Enemy.enemyCount;
}
}
위에선 3이 나오겠지??
즉, 주로 사용하는 방법은 게임 전체에 수를 제한하거나, 알고 싶을 때 주로 많이 쓴다.
또한 쓰기도 편하다.
"클래스 이름" 과 "." 만 있으면 가능하니까 좋다.
이번엔 static method는 어떨까?
using UnityEngine;
using System.Collections;
public static class Utilities
{
//A static method 또한 객체 생성 없이 바로 사용된다.
//하지만 static methods static이 아닌 variable에는 접근할 수 없다.
public static int Add(int num1, int num2)
{
return num1 + num2;
}
}
객체 없이 이렇게 사용가능하다.
다만 static이 아닌 변수에 접근할 수 없는 이유는.
static은 클래스의 변수로 사용되지만
non-static은 각 instance의 변수로 사용되기 때문이다.
using UnityEngine;
using System.Collections;
public class UtilitiesExample : MonoBehaviour
{
void Start()
{
//static variable과 마찬가지로 클래스 이름과 .만으로 가능하다.
int x = Utilities.Add (5, 6);
}
}
마지막으로 Class도 static으로 선언될 수 있다.
다른 static 변수나 메서드와 마찬가지로 객체를 가질 수 없다. 아니 안 쓴다. 그러려고 만들었으니까.
주로 개수 파악에 쓰인다면
각 클래스의 Awake(), Start()에
++연산이 쓰여서 셀 수 있게 하겠고
오브젝트가 파괴되는 OnDestroy()에
--연산이 쓰이면 되지 않을까 생각한다.
더 나아가 모두가 하나를 가리킨다는 것이 쓰이려면
그 하나가 정말 많은 오브젝트에서 참조할 때!! 쓰는 것이 좋겠다.
Player의 위치를 받아서 총을 쏘는데..
각 Enemy가 100개라고 할 때
각 Enemy의 스크립트 Awake()에서 player 오브젝트의 transform의 position을 얻고 뭐 어쩌고 저쩌고...하면
100번의 연산을 해야한다.
하지만 정적으로 선언이 되어 있다면 1번으로 되지 않을까..?
아니 굳이 Awake()의 한 문장을 아껴서 100문장을 아낄 수 있는 것이다.
아니면 정말 게임의 가장 큰 것 같은 것을 static으로 선언하면 좋을 것 같다.
Life 라던지, 점수라던지, 뭐 그런 것들
근데 또 알고보면 게임의 가장 큰 틀이 참조도 많이 된다.
역으로 함부로 static으로 선언하는 것은 좋지 않다.
정적 변수의 값을 초기화해야하기 때문인데 isClear를 전역변수로 설정한다치자.
그럼 스테이지 다음 판에도 isClear = True 값을 가져서 계속 클리어될 수 있다.
사용하려면 초기화시키는 코드도 넣어줘야 한다.
그리고
static 많으면 쓸모도 없는 메모리 낭비가 될 수 있는 것이다.
즉, 웬만하면 지양하고 정말 이거 참조가 많이 되어서 쓰면 좋겠는데? 만 쓰자.
참고링크
'Game Development, 게임개발 > 개발' 카테고리의 다른 글
제너릭, Generics [Unity] (0) | 2021.03.24 |
---|---|
Method Overloading, 메서드 오버로딩 [Unity] (0) | 2021.03.24 |
C#에서의 삼항 연산자 Ternary Operator [Unity] (0) | 2021.03.22 |
Linear Interpolation, 선형 보간법 (0) | 2021.03.21 |
Start()와 Awake()의 차이 [Unity] (0) | 2021.03.21 |