-
[유니티] 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
이러한 자료구조가 있다는 것을 알았으니 관리해야하는 데이터가 생겼을 떄, 어떤 형태로 관리할지 정할 떄 조금 더 수월하게 진행할 수 있을 것 같다.
'유니티 노트' 카테고리의 다른 글
[유니티] xcrun: error: SDK "iphoneos" cannot be located 빌드 에러 해결 방법 (0) 2023.11.17 [유니티] JSON 데이터 불러오기 (0) 2023.11.13