ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [유니티] C# 자료구조에 대해 알아보자
    유니티 노트 2023. 11. 15. 08:23

    * 유니티에 대한 어떠한 베이스 없이 프로젝트를 시작해보았습니다.

    * 잘못된 정보에 대한 피드백은 언제나 환영입니다.

     

    자료구조를 알아보는 목적:

    어떤 자료형이 있는지 알고 그 쓰임새를 알아야 조금 더 나은 코드를 작성할 수 있다고 생각.

    요약:

    1. List<T> : 동적 배열

    2. Dictionary<TKey, TValue> : 키-값 쌍 관리

    3. HashSet<T> : 중복을 허용하지 않는 집합

    4. Queue<T> : 선입선출(FIFO, First In First Out) 구조
    5. Stack<T> : 후입선출(Last In First Out) 구조


    예시 코드와 함께 알아보자.

    1. List<T>

    List<string> names = new List<string>();
    
    // 데이터 추가
    names.Add("Alice");
    names.Add("Bob");
    names.Add("Charlie");
    
    // 데이터 제거
    names.Remove("Bob");

     

    이 글을 적게 된 이유가 이 List 자료구조 떄문이다. 단순 Array와 List의 차이를 알고 싶었다.

    Javascript를 사용하던 나는 언제 Array를 사용하고 언제 List를 사용해야 하는지 몰랐다.

    하지만 간단하게 검색만으로도 그 차이를 대략적으로 알 수 있었다.

     

    정리하자면, Array와 List는 비슷하지만 중요한 차이점이 있다.

    Array

    1. 고정 크기: 배열은 선언할 떄 크기가 고정되며, 크기를 동적으로 변경할 수 없다.

    2. 메모리 할당: 배열은 메모리에 연속적으로 할당되며, 요소들은 인덱스를 통해 직접 접근된다.

    3. 속도: 인덱스를 통한 직접 접근으로 일반적으로 더 빠른 속도를 가진다. ( 더 빠른 속도를 가지는 이유는 조금 더 공부해서 남겨보겠다. )

    4. 크기 변경 방법: 크기를 동적으로 변경할 수 없으므로 배열의 크기를 변경하려면 새로운 배열을 생성하고 데이터를 복사해야한다.

    List

    1. 가변 크기: List는 크기를 동적으로 조정할 수 있는 배열이다.

    2. 메모리 할당: 내부적으로 배열을 사용하지만, 크기가 동적으로 조정되므로 고정된 크기의 배열보다 유연하다.

    3. 속도: 배열보다는 속도가 느리지만, 크기를 동적으로 조정할 수 있는 유연성이 있다.

    4. 크기 변경 방법: 데이터를 추가하거나 제거할 때 동적으로 변경된다.

     

    언제 어떤 것을 사용해야할까?

    Array

    : 크기가 고정이면서 인덱스 기반 접근이 필요한 경우

    아직 성능이 얼마나 차이가 나는지 모르지만, 더 나은 성능을 위해 Array 타입을 선택했다가 크기를 조정해야하는 일이 발생하면 아무 소용없으니 고정크기의 데이터를 다룰 때 사용하는 것이 맞는 것 같다.

    그렇다고 아예 넉넉하게 크기를 잡아두고 Array를 사용한다? 그것은 메모리 낭비이지 않을까 생각이 든다.

     

    List

    : 크기가 동적이거나 자주 변경되는 경우

    고정된 크기의 데이터가 아니라면, 대부분의 경우에 List를 사용하게 될 것 같다.

     

    나머지 자료구조는 간단한 예시 코드만 살펴보고 프로젝트를 진행하면서 각각의 자료구조에 대한 필요성을 조금 더 느낄 때 구체적으로 알아보도록 하자.

    2. Dictionary - 키-값 쌍 관리

    Dictionary<string, int> scores = new Dictionary<string, int>();
    
    // 데이터 추가
    scores["Alice"] = 100;
    scores["Bob"] = 150;
    scores["Charlie"] = 120;
    
    // 데이터 제거
    scores.Remove("Bob");

     

    3. HashSet - 중복을 허용하지 않는 집합

    HashSet<int> uniqueNumbers = new HashSet<int>();
    
    // 데이터 추가
    uniqueNumbers.Add(1);
    uniqueNumbers.Add(2);
    uniqueNumbers.Add(1); // 중복된 값이므로 무시됨
    
    // 데이터 제거
    uniqueNumbers.Remove(1);

     

    4. Queue - 선입선출 구조

    Queue<string> tasks = new Queue<string>();
    
    // 데이터 추가
    tasks.Enqueue("Task 1");
    tasks.Enqueue("Task 2");
    
    // 데이터 제거
    string task1 = tasks.Dequeue(); // "Task 1"

    5. Stack - 후입선출 구조

    Stack<int> numbers = new Stack<int>();
    
    // 데이터 추가
    numbers.Push(1);
    numbers.Push(2);
    
    // 데이터 제거
    int topNumber = numbers.Pop(); // 2

     

    이러한 자료구조가 있다는 것을 알았으니 관리해야하는 데이터가 생겼을 떄, 어떤 형태로 관리할지 정할 떄 조금 더 수월하게 진행할 수 있을 것 같다.

Designed by Tistory.