인프런 커뮤니티 질문&답변
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
그러고보니 마지막 질문이 하나 더 있었군요.
[마지막으로 어떠한 변수를 heap에 저장할 때 필수적으로 stack에서 참조값을 저장하게 되는 것 인가요? ]
이건 꼭 그렇진 않습니다.
C#에서 할당된 메모리는 아무도 참조하고 있지 않으면 (존재를 모르면)
GarbageCollector라는 애가 메모리를 회수하고 정리하는 작업을 합니다.
따라서 어딘가에는 참조값을 들고 있어야 하지만, 꼭 그것이 스택이라는 보장은 없습니다.
예를 들어
class A
{
}
class B
{
A a = new A();
}
와 같은 상태에서 B를 new B()로 할당하면 B는 힙 영역에 할당되는데,
B 생성 과정에서 a = new A()를 하게 됩니다.
이 때는 스택이 아닌 B 객체의 메모리 (=힙)에 저장되어 있겠죠.
0
안녕하세요,
참조값이란 어마어마하게 신비로운 것은 아니고 그냥 8바이트(long) 정수입니다.
그런데 [그 8바이트 정수가 나타내는 숫자에 해당하는 주소로 가보면, 실제 데이터가 있다!] 는 의미에 불과합니다.
이해를 돕기 위해 아래 스샷을 보시면,
RoomClass의 경우 0x0002d2a6bcab60라는 주소(참조)를 들고 있고,
해당 주소를 타고 가보면 실제 RoomClass의 데이터가 있는 것을 알 수 있습니다.
결과적으로 ref a, out a를 할 때는 a라는 변수의 주소값을 8바이트 변수로 넘기는 것이고, (이 주소는 스택의 주소겠죠)
a = 1를 할 때는 마찬가지로 [ref a로 넘긴 주소값에 가서 1이라는 데이터를 저장]하는 과정을 거친다고 보시면 됩니다.
사실 이 부분이 C#에서 보면 굉장히 헷갈리는데,
C++에서 포인터를 공부하시면 조금 더 쉽게 이해가 갈 거에요.





