본문 바로가기
유니티/개념 정리

Static(정적)

by fore4022 2024. 11. 4.

Static이란?

  • Data 영역에 저장된다.
    • Data 영역에 저장되는 모든 전역, 정적 변수와 메서드의 메모리는 애플리케이션이 실행될 때 할당되고, 애플리케이션이 종료될 때 메모리에서 해제된다.
  • static 키워드로 생성한 변수나 메서드는 사본이 생성되지 않는다.

장점

  • 클래스를 통해서 static 변수와 메서드에 접근해서 사용 가능하다.
  • 원하는 값이 사라지지 않도록 할 수 있다.

단점

  • static 메서드 내에서는 static 변수와 메서드만 사용 가능하다.
  • static 키워드의 변수와 메서드가 많아질 수록 메모리 사용량이 많아진다.
  • static 변수의 사용에 있어서, 별도의 초기화 작업이 수행될 필요할 수 있다.

Static의 접근 지정자

Static 또한 접근 지정자에 영향을 받는다. 그렇기 때문에 public이 아닌 static 변수와 메서드는, 외부에서 클래스를 통해서 접근할 수 없다.

public class ExampleA
{
	public static int valueA = 10;
	protected static int valueB = 20;
	private static int valueC = 30;
}
using UnityEngine;
public class Test : MonoBehaviour
{
	private void Start()
	{
		Debug.Log(ExampleA.valueA);
		Debug.Log(ExampleA.valueB);//오류 발생, valueB에 접근 할 수 없다.
		Debug.Log(ExampleA.valueC);//오류 발생, valueC에 접근 할 수 없다.
	}
}

Non-Static과 Static의 차이

Non-Static과 Static으로 만들어진 변수와 메서드를 확인해 보겠다.

Non-Static

  • 변수 : 각 instance마다 다른 값을 얻을 수 있다.
  • 메서드 : 각 instance마다 같은 메서드가 하나씩 생겨서, 차지하는 메모리가 많아진다.
public class ExampleA
{
	private int valueA = 10;
	
	public int ValueA { get { return valueA; } set { valueA = value; } }
}
using UnityEngine;
public class Test : MonoBehaviour
{
	public ExampleA instanceA = new();
	public ExampleA instanceB = new();
	
	private void Start()
	{
		instanceA.ValueA = 10;
		instanceB.ValueA = 20;
		
		Debug.Log(instanceA.ValueA);
		Debug.Log(instanceB.ValueA);
	}
}//실행 결과 : 각 instance의 valueA가 10, 20으로, 서로 다른 값이 출력되는 것을 확인할 수 있다.

Static

static으로 선언된 변수와 메서드는 객체를 통해서 접근할 수 없다.

  • 변수 : 모든 instance가 하나의 공통된 값을 가진다.
  • 메서드 : 모든 instance가 하나의 메서드를 가진다.
public class ExampleB
{
	public static int valueA = 10;
	protected static int valueB = 20;
	private static int valueC = 30;
	
	public int GetA { get { return valueA; } }
}
using UnityEngine;
public class Test : MonoBehaviour
{
	public ExampleB instanceA = new();
  private ExampleB instanceB = new();

  private void Start()
  {
	  Debug.Log(instanceA.GetA);
    Debug.Log(instanceB.GetA);

    A.valueA = 20;

    Debug.Log(instanceA.GetA);
    Debug.Log(instanceB.GetA);
  }
}//실행 결과 : 처음에는 10, 10이 출력되고, 20, 20이 출력되는 것을 볼 수 있다.

Static 클래스

  • static 클래스 내부의 모든 변수와 메서드는 static이어야 한다.
  • 접근 지정자 protected를 사용할 수 없다.
  • 객체에 컴포넌트로 추가될 수 없다.
  • 상속으로 구현할 수 없다.

Static 클래스와 클래스의 차이점

위의 예시를 본다면, 클래스는 static이 아닌데도 불구하고, 클래스의 이름을 통해서 내부의 static인 값을 가져와 사용하는 것을 볼 수 있다.

그렇다면 아래와 같은 의문이 생길 것이다.

"정적 클래스랑 일반 클래스에서 정적 값을 가져와 사용하는 것이 뭐가 다르나요?"

기본적으로 일반적인 클래스와 차이가 없다.

static 클래스로 내에 있는 모든 변수와 메서드가 정적이어야 한다는 것이다.

"그러면, 왜 정적 클래스를 만드나요?"

static의 특성상, 제약 없이 어느 클래스에서든 접근할 수 있기 때문에, 오류가 발생하기 쉽다. 그런 static 변수와 메서드를 관리하는데 이점을 얻기 위해서 static 클래스를 만든다. 그렇기 때문에 무조건 static 클래스를 만들어서 사용할 필요는 없다.


주의할 점

  • 사용하지 않는 변수와 메서드 모두 메모리를 차지하고 있는다.
  • static 변수는 값이 변하지 않기 때문에, 값의 변화에 주의해야 한다.
  • static이라 해도 접근 지정자에 영향을 받는다.

유니티에서는 Vector와 Quaternion을 디컴파일해 본다면, 수 많은 static 메서드들이 있는 것을 확인해 볼 수 있다. 또한 대표적으로 static을 사용하는 싱글톤 패턴이 있다.

static은 사용이 편리하지만, 남용할 경우 여러 문제를 일으킨다. static을 사용하는 경우나, 이미 static으로 만들어 둔 코드가 있다면 static이 필요한가에 대해서 한 번더 고민해 보았으면 한다.

'유니티 > 개념 정리' 카테고리의 다른 글

IEnumerable과 IEnumerator  (0) 2024.11.18
Predicate(술어)  (0) 2024.11.11
Interface  (0) 2024.10.30
ObjectPool  (0) 2024.10.23
실행 결과 보장  (0) 2024.10.21