• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Heap 과 Stack

21.04.28 04:24 작성 조회수 196

0

강의를 듣고 제가 이해한 내용이 맞는가 알고 싶습니다

구체적인 이유는 모르겠으나, 메모리를 Heap과 Stack으로 나눈것은, 용도의 차이를 둬서 효율성을 꾀한것으로 보입니다

아직 찾아보진 않았으나, Stack에 올라오는 것들은 Heap에 올라오는 것들 보다 크기가 작은 것들이 아닐까 짐작이 됩니다

참조를 쓰지 않고 바로바로 값에 접근을 해도 될 만큼 작은게 아닌지요?

반면, Heap에 올라오는 것들은 Stack에 저장하기에는 너무 크기가 크고, 복잡하기 때문에 Stack에 참조 변수라는 단말기를 만들어두고, 거기에 Heap의 주소를 입력해둔 것이라 봅니다

거기다, new 생성자와 Garbage Collector가 필요한 것도, Stack 보다 많이 복잡하고 크기 때문에 생성하고 지우는 절차가 더 까다로운 것으로 보입니다

함수 밖의 값 형식. 저는 이걸, 멤버 변수라고 이해 했는데 맞는가 확신이 서질 않습니다.

그리고 이것이 어째서 Heap에 존재해야만 하는지는, 어렴풋이이 멤버변수들은 클래스로 부터 생겨난 Instance의 실제 데이터들이기 때문에 그러지 않는가 싶은데 맞나요?

답변 1

답변을 작성해보세요.

1

안녕하세요. 생각하고 계신게 맞습니다. 

용도에 달라서 구분해서 사용하기 위한 것이죠. 

힙에는 큰데이터를 사용합니다. (메모리관리를 해야 하는 하는 데이터들이 여기에 들어가죠)

그리고 작은 데이터라고 해도 멤버변수는 클래스 안의 데이터이기에 힙에 들어갑니다. 

스택은 함수안의 int 같은 기본자료형의 지역변수들이 그렇게 동작합니다.

함수의 파라메터도 마찬가지로 스택으로 동작하죠 

그래서 함수가 실행될때 생겼다가 사라집니다. 

또 아래 그림처럼 함수의 파라메터가 기본자료형이 아니라 클래스일 경우에는 이것의 실제 데이터는 힙에 있고요. 

하지만 변수자체는 스택에 생겼다가 사라집니다. 하지만 실제 데이터는 다른 곳에서 참고하고 있는데이터가 있을 것이기에 실제 클래스의 변수 자체를 가비지 컬렉터가 없애지는 않겠죠. 

그림으로 본다면 다음 데이터입니다. 

 public class MyData{

      int x;

      int y;

}

public class TestScript : Monobehaviour {

      MyData data;

       void Start(){

              data = new MyData();

       }

       void TestFunc(MyData d){

               print(d.x + d.y);

       }

}

결론적으로 생각하고 계신게 맞습니다. 많이 진행되셨네요. 축하드립니다. 

나중에 강의 끝쪽에 있는 리스트하고 배열 부분이 잘 이해되시면 좋겠네요. 이걸 확실히 이해하면 나중에 그 부분이 쉽습니다. ^^