• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Vertex참조부분 문의드립니다.

21.02.17 02:53 작성 조회수 184

1

안녕하세요.

이해가 가지않아서 문의드립니다.

뒤에 DFS나 BFS는 이해가 갔는데요. 이부분에서 이해 못하고 넘어간게 걸려서 다시 돌아왔습니다. 혹시나 도움이 될까 연결리스트부분을 다시 듣고 이해한 후 봐도 또이해가 가지않는데요,,

class Vertex

{ public List<Vertex> edges = new List<Vertex>();}

이 부분이 연결리스트에서 보면 그냥 참조(주소)값인데

연결리스트에서는 다음방의 주소, 이전방의 주소 이거였으니

저 구문의  뜻은 edges라는 참조(주소)값 으로 이해했습니다.

그냥 참조값 끝 왜만들었는지 의문?이듭니다..

그리고 CreateGraph()에서

List<Vertex> v = new List<Vertex>(6) 이부분을 디버깅하면

new Vertex() 마다 위에 edges 참조에 갔다가 오는데.. 왜이러는지도 모르겠습니다.

그리고 edges.Add(v[1])이면 이해하는데 어떻게 v[0].edges.Add(v[1]); 이게되는지 이해가 가지않습니다. 어떻게 v가 edges를 메서드처럼 쓰는지..

이부분이 이해가가지않아 2틀째 고뇌하고있습니다.. 다음강의를 듣다가도 그게 왜그런지 싶어 집중이 되지않네요.. 

감사합니다.

답변 4

·

답변을 작성해보세요.

2

리스트 안에 참조값 자체를 넣어서 헷갈릴 수 있으니 
ID를 부여해서 관리하면 다음과 같습니다.

다음과 같이 연결해주고.

메모리를 살펴봅시다.

모든 Vertex 목록은 다음과 같습니다.

그 중에 0번 정점을 살펴보면 다음과 같습니다.

0번 정점과 연결된 목록은 edges를 통해서 확인이 가능한데요.

2개가 연결되어 있는데 참조값이라서 헷갈리니 ID를 확인하면.
ID=1, ID=3번인 Vertex가 저장되어 있음을 확인을 수 있습니다.

1

정점은 위에서 동그라미 표시로 되어 있는 애들이고,
정점끼리는 화살표로 연결 관계가 있습니다.
위 그림에서 0번 정점은 1번, 3번 정점으로 갈 수 있고, 이것을 간선(edge)라고 합니다.

class를 설계할 때 멤버 변수를 넣을 수 있는데요.

class Knight
{
   public int hp;
}

이러면 Knight는 hp를 갖고 있겠죠.
마찬가지로 Vertex라는 정점 클래스를 설계할 때, 인접한 정점이 딱 한개라면 다음과 같이 만들겁니다.

class Vertex
{
    Vertex neighbor;
}

Vertex 안에 멤버변수를 Vertex를 갖고 있는게 당혹스러울 수도 있지만,
LinkedList에서 살펴본 Node와 비슷한 사용법입니다.

그런데 현재 위 그림에서 보면 Vertex가 딱 1개의 정점만 연결되어 있는게 아니라,
다수의 정점과 연결되어 있을 수 있는데요.

class Vertex
{
  List<Vertex> edges;
}

그래서 최종적으로 위와 같이 설계가 된 것이죠.
정점마다 연결된 이웃 정점이 다르니, 각기 세팅을 해준 것입니다.

0->1, 0->3 연결이 되어 있으니

이렇게 0번 정점의 edges 에 1, 2번 정점을 추가해준거죠.

0

손기명님의 프로필

손기명

질문자

2021.02.17

아 방금 디버그로 정말 많은걸 깨달았습니다.

우선 메서드 밖에 객체를 생성한것이(호출안해 아직 생성안됨)

아래 메서드에서 객체를 만들때마다 생성이되는군요.

아 다깨닫게 되었습니다.

그래서 각 v 객체마다 위 밖에있는 만들어놓은 리스트에

생성해서 넣은거군요!!!!! 와 진짜 메서드 밖에 리스트가 메서드 안에서 호출할때 생성되어 그 리스트 멤버변수를 불러서 그 생성된 객체에 저장하고있던거군요.

즉 v[0]객체의 생성된 멤버 리스트 객체 edges[0] = 1, edges[0] = 2

정말 감사합니다 생성자도아닌데 왜 클래스 리스트멤버 객체가 만들어졌다고 생각했는지ㅠㅠ..

아 감사합니다.!! 

0

손기명님의 프로필

손기명

질문자

2021.02.17

아 이제 들어가는건 이해를 하였습니다. v는 클래스 객체이므로 그에 속한 멤버변수에 접근이 가능해서

v[0].edges.Add(v[1]); 이런 표현이 가능한건데 다만 아직 이해가 안가는 부분은 v[0].edges.Add(v[1])입니다.

0번 정점의 edges에 1, 2번을 추가한다고 하셨는데 링크드리스트는 방이 들어가고 삭제되는 것을 확인이가능하였는데.

v[0].edges.Add(v[1])는 연결이 되었는지 어떻게 확인할 수 있나요?

디버그를 돌려보아도 조사식에 count6으로만 나오고 콘솔로 찍어보아도 System.Collections.Generic.List`1[ConsoleApp1.Vertex] 이런식의 이상한 글만나오게 되어서

지금 서로 연결이 된것인지 아니면 저위에값이 v[0]에 edges(v[1])을 넣고 뭘하는것인지

알수가없어서 어떻게 확인할 수있을까요? 지금 제 머리에는 그냥 추상적으로

v[0].edge.Add(v[1])을 하면 알순없지만 v[0]정점과 v[1]정점이 연결되는구나라고만

생각이되어서요.

LinkedList를 생성해서 넣으면

link.AddFirst(100);

또는 LinkedListNode<int> a = link.AddLast(101);

이런식으로 아 어디저장이되는구나 직관적이고 이해가가는데 저위에 방식은

추상적이고 이해가 잘가지않습니다..