공부/Game Bootcamp

[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : 자료구조(LinkedList)

Ail_ 2024. 12. 3. 17:17

 

LinkedList

    void Start()
    {
        // c#에서 제공하는 링크드 리스트를 체험해보기 위해 선언과 할당
        LinkedList<int> list = new LinkedList<int>();
        
        // list의 tail(꼬리) 뒤에 1 추가
        list.AddLast(1);
        list.AddLast(2);
        list.AddLast(3);
        list.AddLast(4);
        
        // list의 head(머리) 앞에 2 추가
        list.AddFirst(0);
        
        // * -> 연속적이지 않고, 어딘가 메모리가 존재하는데 그 주소를 담고 있음
        // 싱글 링크드 리스트
        // []* -> []* -> []*
        // 더블 링크드 리스트
        // *[]* <-> *[]* <-> *[]*
        
        var enumerator = list.GetEnumerator();

        int findIndex = 3;
        int currentIndex = 0;

        while (enumerator.MoveNext())
        {
            if (currentIndex == findIndex)
            {
                Debug.Log(enumerator.Current);

                break;
            }

            currentIndex++;
        }
    }

조건문에 해당 할 때 (findIndex이랑 같아졌을 떄) 로그 출력됨

 

구현해보기

// T 혹은 Ty 많이 씀(Type 매개변수라는 뜻)
public class Node<T>
{
    public T Data { get; set; }
    public Node<T> Next { get; set; }

    public Node(T data)
    {
        Data = data;
        Next = null;
    }
}

public class LinkedListCustom<T>
{
    // 맨 처음에 노드상의 제일 앞부분을 Head라고 선언
    public Node<T> Head { get; private set; }

    // 뒤에 요소 추가
    public void Add(T data)
    {
        // 새로운 노드 생성
        // 노드: 데이터와 next를 담은 구조체
        Node<T> newNode = new Node<T>(data);
        if (Head == null)
        {
            Head = newNode;
        }
        else
        {
            // current -> Next가 null일때까지
            // 반복문을 수행
            
            // [head][next] -> [node][next] -> [node][next}
            
            Node<T> current = Head;
            
            // current를 계속 최신화
            while (current.Next != null)
            {
                current = current.Next;
            }
            
            // 맨 마지막의 노드의 next에다가 새로운 노드를 연결
            current.Next = newNode;
        }
    }
    
    public void Traverse()
    {
        Node<T> current = Head;
        while (current != null)
        {
            Debug.Log(current.Data);
            current = current.Next;
        }
    }
}

 

AddFirst 구현해보기

    public void AddFirst(T data)
    {
        Node<T> newNode = new Node<T>(data);
            Head = newNode;
            newNode.Next = Head;
            Head = newNode;
    }

 

 

DoubleLinkedList 구현

앞뒤로 Prev랑 Next가 있음

public class DNode<T>
{
    public T data;
    
    public DNode<T> prev;
    public DNode<T> next;

    public DNode(T inData)
    {
        data = inData;
        prev = null;
        next = null;
    }
}

public class DLinkedListCustom<T>
{
    public DNode<T> head;
    public DNode<T> tail;

    public void AddLast(T data)
    {
        DNode<T> newNode = new DNode<T>(data);
        if (tail == null)
        {
            tail = head = newNode;
        }
        else
        {
            tail.next = newNode;
            newNode.prev = tail;
            tail = newNode;
        }
    }
    
    public void AddFirst(T data)
    {
        DNode<T> newNode = new DNode<T>(data);
        if (head == null)
        {
            tail = head = newNode;
        }
        else
        {
            head.prev = newNode;
            newNode.next = head;
            head = newNode;
        }
    }

    public void Traverse()
    {
        DNode<T> current = head;
        while (current != null)
        {
            Debug.Log(current.data);
            current = current.next;
        }
    }
    
    public void RTraverse()
    {
        DNode<T> current = tail;
        while (current != null)
        {
            Debug.Log(current.data);
            current = current.prev;
        }
    }
}

 

한 분이 이해를 돕기 위해 정리해서 올려주심

 

하다가 프로퍼티부터 헷갈려서 우리의 친구 AI에게 물어봄

Property

1. get과 set은 무엇인가요?

프로퍼티(Property)

  • get과 set은 **C#의 프로퍼티(Property)**에서 사용됩니다.
  • 프로퍼티는 클래스 내부의 데이터를 외부에서 접근하거나 수정할 수 있게 하는 방법이에요.
  • 데이터 보호직접 접근의 편리함을 모두 제공합니다.

2. 쉽게 이해하기

직접 접근 vs 프로퍼티

1. 필드(Field)를 직접 접근하는 방식

public class Example
{
    public int number; // 필드
}
Example example = new Example();
example.number = 10; // 직접 값을 넣음
Debug.Log(example.number); // 값을 직접 가져옴
  • 이 방식은 간단하지만, 데이터에 직접 접근해서 수정할 수 있기 때문에 안전하지 않아요.

2. 프로퍼티를 사용하는 방식

public class Example
{
    private int _number; // 데이터를 직접 외부에서 못 건드리게 private로 설정

    public int Number // 프로퍼티
    {
        get { return _number; } // 데이터를 가져올 때 사용
        set { _number = value; } // 데이터를 설정할 때 사용
    }
}
Example example = new Example();
example.Number = 10; // set을 통해 값을 넣음
Debug.Log(example.Number); // get을 통해 값을 가져옴
  • get: 값을 가져올 때 실행.
  • set: 값을 설정할 때 실행.
  • 데이터를 보호하면서도 접근을 가능하게 합니다.

3. 프로퍼티 구조

public class Example 
{
	private int _value; // private 필드
	public int Value // 프로퍼티
	{ 
		get { return _value; } // 값을 가져올 때
		set { _value = value; } // 값을 설정할 때
    }
}

 

value란?

  • set 블록 안에서 사용되는 특별한 키워드로, 외부에서 전달된 값을 뜻해요.

예를 들어:

Example example = new Example(); example.Value = 42; // 여기서 42가 set의 value가 됨

 

4. 자동 구현 프로퍼티

C#에서는 자동 구현 프로퍼티를 사용하면 더 간단하게 쓸 수 있어요.

public class Example { public int Number { get; set; } // 자동 구현 프로퍼티 }
  • 위 코드는 내부적으로 자동으로 private 필드를 생성해줍니다.
  • 따로 get과 set을 정의하지 않아도 됩니다.

5. get과 set의 커스터마이징

get과 set에 조건을 추가해서 동작을 제한할 수도 있어요.

예: 읽기 전용 프로퍼티

 
public class Example
{
    private int _number = 10;

    public int Number
    {
        get { return _number; } // 값 가져오기만 가능
    }
}
Example example = new Example();
Debug.Log(example.Number); // 출력: 10
example.Number = 20; // 에러: set이 없어서 값을 설정할 수 없음

 

예: 값 검증

public class Example
{
    private int _age;

    public int Age
    {
        get { return _age; }
        set
        {
            if (value < 0) // 나이는 음수가 될 수 없음
            {
                _age = 0;
            }
            else
            {
                _age = value;
            }
        }
    }
}
Example example = new Example();
example.Age = -5; // 음수를 넣으려고 하면
Debug.Log(example.Age); // 출력: 0 (조건에 의해 수정됨)

 

vue.js의 computed랑 node.js의 get, set이랑 비슷한 느낌이네

 

 

 

디버깅 하는 법

rider에서 Attatch to Unity Editor 클릭

구간 잡아주기

f11(step into)로 함수 실행 단계 깊게 볼 수 있음

 

 

사담

자료구조 했었는데 C#으로 보니까 혼란이네ㅋㅋㅋㅋ

그래도 보다보니까 익숙해지는 중...

역시 외국어 배우듯 처음엔 그냥 익숙해져야;;

 

기초반 목표가 수박게임인데 그냥 원하는 게임 하나 구현해도 된다고 하셔서 고민이다

게임을 하나 간단한걸 뭘 구현해볼 수 있을까 흠