강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

한종훈님의 프로필 이미지
한종훈

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

스택과 힙

stack 에 있는 본체를 그 다음 함수가 ref로 받을 때

작성

·

265

0

int a; // stack 에 a 라는 이름의 int라는 크기의 데이터 타입을 생성

a=1; // a 에 데이터 1을 저장

f(ref a); // 함수 f 에 a의 참조값을 넘겨주기

만약 이것이 맞다면, a의 참조값은 언제, 어디에 (stack?)

생성되었나요? 

int a; // a 선언

f(out a); // a의 데이터를 함수 f 안에서 변경하고 그 참조값을 반환???

의 데이터 변경은 어떻게 이루어 지는 것 인가요?

(stack과 heap에서)

마지막으로 어떠한 변수를 heap에 저장할 때 필수적으로 stack에서 참조값을 저장하게 되는 것 인가요? 

답변 3

0

한종훈님의 프로필 이미지
한종훈
질문자

감사합니다. 

정리하자면 거의 모든 데이터는 (gc에 의해 회수되는 데이터 빼고) 자신의 주소를 가지고 있고 (생성과 동시에 ) 주소는 상황에 따라서 stack에 저장될 수도, heap에 저장될 수도 있다는 것 이군요.

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

그러고보니 마지막 질문이 하나 더 있었군요.
[마지막으로 어떠한 변수를 heap에 저장할 때 필수적으로 stack에서 참조값을 저장하게 되는 것 인가요? ]

이건 꼭 그렇진 않습니다.
C#에서 할당된 메모리는 아무도 참조하고 있지 않으면 (존재를 모르면)
GarbageCollector라는 애가 메모리를 회수하고 정리하는 작업을 합니다.
따라서 어딘가에는 참조값을 들고 있어야 하지만, 꼭 그것이 스택이라는 보장은 없습니다.
예를 들어 

class A
{
}
class B
{  
  A a = new A();
}

와 같은 상태에서 B를 new B()로 할당하면 B는 힙 영역에 할당되는데,
B 생성 과정에서 a = new A()를 하게 됩니다.
이 때는 스택이 아닌 B 객체의 메모리 (=힙)에 저장되어 있겠죠.

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

안녕하세요,
참조값이란 어마어마하게 신비로운 것은 아니고 그냥 8바이트(long) 정수입니다.
그런데 [그 8바이트 정수가 나타내는 숫자에 해당하는 주소로 가보면, 실제 데이터가 있다!] 는 의미에 불과합니다.

이해를 돕기 위해 아래 스샷을 보시면,
RoomClass의 경우 0x0002d2a6bcab60라는 주소(참조)를 들고 있고,
해당 주소를 타고 가보면 실제 RoomClass의 데이터가 있는 것을 알 수 있습니다.

결과적으로 ref a, out a를 할 때는 a라는 변수의 주소값을 8바이트 변수로 넘기는 것이고, (이 주소는 스택의 주소겠죠)
a = 1를 할 때는 마찬가지로 [ref a로 넘긴 주소값에 가서 1이라는 데이터를 저장]하는 과정을 거친다고 보시면 됩니다.
사실 이 부분이 C#에서 보면 굉장히 헷갈리는데,
C++에서 포인터를 공부하시면 조금 더 쉽게 이해가 갈 거에요.

한종훈님의 프로필 이미지
한종훈

작성한 질문수

질문하기