[Unity, C#] 구조체(struct)는 왜 new 문법을 지원할까?

2022. 1. 13. 22:26Game Development/Unity

 

 

C#에서 구조체는 값 형식(value type)이기에, 스택(stack)에 데이터를 담고 있는 변수 체계다. 레퍼런스 형식(reference type)은 실제 데이터는 힙(Heap) 영역에 존재하고, 스택(Stack)에는 해당 데이터로 가는 주소를 담고 있는 변수 체계다.

 

결론적으로 Vector3, Vector2구조체이기에 지역 변수로 생성한 경우, 로직이 끝나는 블록(block)을 만나게 되면 자동 메모리 반납 처리가 된다.

void Update()
{
   Vector3 vec3 = new Vector3();
   Vector2 vec2 = new Vector2();
} // 끝나는 블록을 만났으므로, vec3, vec2 메모리 반납

 

C#은 힙 할당을 하는 클래스 객체 생성과 헷갈리게 왜 이런 new 문법을 지원하도록 만들어놨을까? 구글에 검색해보며 찾아 보니, 통일성과 생성자 호출을 위해서라고 한다. 구조체 또한 클래스처럼 생성자로 초기화를 할 수 있게 만들고, 그 과정에서 클래스와 통일성을 지키려고 이렇게 한 것으로 보인다.

 

근데 막상 공부하다 보니, 다음 내용이 궁금해졌다. 클래스 내부에 멤버 변수로 구조체를 선언하면 어디에 생성될까?

public class Test : MonoBehaviour
{
    Vector2 globalVec = new Vector2();  // 멤버 변수로 선언

    void Start()
    {
        ...
    }
    
    void Update()
    {
        ...
    }
}

 

멤버 변수도 전역 변수의 일종(인스턴스 변수)으로 알고 있다. 그렇다면, Data 영역에 생성되지 않을까?란 생각이 들긴 하는데, 흠 정확히는 모르겠다.

 

멋진 분께서 댓글로 스택 영역에 생성된다고 알려주셨습니다. 감사합니다. :)

728x90
반응형