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

호야님의 프로필 이미지
호야

작성한 질문수

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

TextRPG2 마무리

클래스의 선언범위가 궁금합니다.

해결된 질문

작성

·

212

0

안녕하세요 좋은 강의 감사합니다 ^^.

{  { }  } 이것처럼 중괄호가 두개 있을 때 가장 안쪽의 중괄호에서 생성한 클래스는 그 바깥에서 참조가 불가능했는데요, 이 때 개념이 모호해서 질문드립니다.

클래스의 실제값은 힙에 존재하고 이를 참조로 접근한다고 알고 있습니다. 그리고 c#의 경우 힙은 컴파일러가 알아서 다룬다라는 개념으로 알고 있는데요, 위의 상황처럼 중괄호 안에 지역적으로? 선언된 클래스는 바로 할당이 해제되기 때문에 바깥 중괄호에서 접근할 수 없는 건가요?

답변 2

1

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

누구한테나 많은 혼동을 일으키는 부분인데요.

class Knight 
{
  // ...
}


{
  Knight k = new Knight();
}

처럼 만들면 클래스의 실제값(Knight 객체 자체)는 힙에 올라가는 것이 맞지만,
실제 Knight k라는 참조 변수 자체는 스택 영역에 있습니다.
그리고 해당 내용물은 Knight 객체의 주소(힙 영역)를 가리키고 있는 상태입니다.
중괄호 안에 지역적으로 만들어진 변수 자체의 유효범위는 그 중괄호 안이기 때문에,
이를 밖에서 사용할 수가 없는 것입니다.
결과적으로 힙과는 무관하게 정말 지역 변수의 특성 때문에 사용이 불가능한 것이죠.

[중괄호 안에 지역적으로 선언된 클래스는 바로 할당이 해제된다]는 말씀은 부분적으로만 맞는데

{
   Knight k1;
   {
      Knight k2 = new Knight();
      k1 = k2;
   }

    k2 변수 자체는 소멸됐으나, Knight 객체는 살아있음!!
}

위와 같이 다른 변수에서 객체를 참조해버리면
설령 k2가  { } 영역 밖으로 벗어나 사라진다고 하더라도, 
힙에 잡힌 객체가 k1 덕분에 당장 소멸되진 않습니다.
(자신을 기억해주는 이가 하나라도 있으면 살아남는 감동 스토리)

참고로 힙과 스택은 아래처럼 확인이 가능합니다.

0

호야님의 프로필 이미지
호야
질문자

상세하고 빠른답변 감사드립니다! 이해에 큰 도움이 됐습니다.

호야님의 프로필 이미지
호야

작성한 질문수

질문하기