• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

root 노드 아래를 중괄호로 나누는 이유가 궁금합니다.

20.06.07 18:31 작성 조회수 244

6

안녕하세요

이 코드에 있는 중괄호는 root를 생성하고 동시에 Data값을 "R1개발실"이라고 초기화 해주는 이니셜라이저라는 것 까지는 이해했는데요

그밑에 다시  중괄호를 열어서 그 안에 node를 생성한 이유를 잘 모르겠습니다. 

아래와 같이 중괄호 없이 실행해봐도 root의 children으로 node가 들어가는 것은 같던데 트리구조를 나타내기위해 쓰는 건가요? 

답변 5

·

답변을 작성해보세요.

3

node라는 이름은 우리가 보기 편하라고 이름을 지어준거지만,
사실은 스택 메모리 어딘가에 위치해 있습니다.
(컴파일 후에는 rbp-0x10와 같은 스택 주소를 나타내는 코드로 치환됨)
TreeNode<string> 인스턴스는 Heap 영역에 올라가고,
node라는 바구니에는 해당 인스턴스의 주소(참조)가 들어가 있는 상태입니다.
또한 node라는 바구니가 { } 범위 밖이라서 더 이상 유효하지 않다면,
node 변수는 더 이상 사용 불가능하지만 객체가 꼭 사라지는 것은 아닙니다
(0x100 주소를 다른 곳에서 참조한다면, 살아남겠죠)

node.Children.Add(new ~~)로 이름없이 실시간으로 인스턴스를 밀어넣으면
새로 만들어진 객체의 주소가 Children 리스트에 들어가게 됩니다.
리스트도 참조 타입이니 그냥 주소를 들고 있는데 (아래에서 0x200)
그 주소를 타고 가면 동적으로 생성한 배열이 있을테고 거기에 방금 생성한 Node의 주소가 하나씩 있겠죠!

결국 참조값은 그냥 주소를 들고 있는 바구니라고 생각하면 이해하기가 수월합니다!

2

특별히 어떤 문법적인 의미가 있는 것은 아니고,
묶어서 보기 좋게 관리하고 싶어서 그런겁니다.

그리고 { } 를 안 쓰면 같은 이름을 재사용하지 못하니
TreeNode<string> node에서 node 이름을 바꾸던가
다음에 등장할 땐 TreeNode<string> 부분을 떼어야 하는데,
그 처리를 하기 싫어서 그냥 저렇게 해준겁니다.

결론 : 아무 의미없음

1

Hyobin Kim님의 프로필

Hyobin Kim

2021.01.13

이부분에 관해서 한가지만 더 질문을 드리고 싶습니다

이 강의의 다른 질문에서 

변수의 이름은 사람에게나 의미가 있지 로우 레벨에서 컴파일된 뒤로는 주소로 치환되기 때문에 컴퓨터에게 의미가 있는건 아니라고 하셨잖아요?

이 코드들을 보면 괄호 root를 만들고나서 그 안에 node라는 동일 이름으로 3가지 TreeNode<string> 클래스의 인스턴스가 생성되고, 이름을 재사용하기 위해서 { }로 구분해줬구요

이때, 이전 답변의 표현을 빌리자면, List<TreeNode<T>> 클래스의 프로퍼티 Children이 List이고, 이 List에 node 라는 이름의 3개의 인스턴스가 저장이 됩니다. 이 떄 저 이름이 같은건 아무런 의미가 없죠? 그냥 단순히 바구니의 이름이 똑같을 뿐 컴퓨터 내부에선 다른 인스턴스로 구분이 되는거죠?

1

네 그렇습니다.
다만 { } 안에서 만들어서 사용하는 변수들은 { } 내부에서만 유효하니,
오히려 { }를 벗어나면 해당 변수를 못 쓰는 단점도 생깁니다.

1

Hyobin Kim님의 프로필

Hyobin Kim

2020.12.03

혹시, 저 괄호 넣는건 언제 어디서든 보기 좋게 관리 하고 싶다면 넣어도 문제가 없는 건가요?