컬렉션이란
같은 성격을 가지는 데이터 모음을 담는 자료 구조로 사용하기 편리하지만 박싱, 언박싱이 일어나기 떄문에 성능상으론 좋지 않은 편이다. 그렇다면 왜 만들었을까? 컬렉션은 C# 1.0에서 만들어졌다(오래됐다). 다음 포스팅에서 이것이 보완된 제네릭에 대해 다룰 예정이다.
컬렉션을 알기 전에 배열에 대해 잠시 짚고 넘어가자
![]() |
![]() |
위 코드를 보면 알 수 있듯이 처음 arr을 선언하면 arr은 new int[40]으로 생성된 인스턴스의 주소값을 가지게 된다. 후에 배열의 크기를 바꾸고 싶어 변경했을 경우 arr이 new int[50]으로 생성된 인스턴스의 주소값을 가지게 되므로 처음 값을 넣었던 arr[0]에 기존 데이터는 날라간다. 이처럼 배열은 크기를 조절할 때 효율적이지 못하다. 이를 보완하기 위해 ArrayList를 사용한다.
ArrayList
using System.Collections; // ArrayList 사용시 선언해야 한다.
using System.Collections.Generic;
using UnityEngine;
public class CollectionEx : MonoBehaviour
{
void Start()
{
ArrayList list = new ArrayList();
list.Add("A");
list.Add(6);
list.Add(true);
for (int i = 0; i < list.Count; i++)
{
Debug.Log($"list[{i}]: {list[i]}");
}
Debug.Log($"list.Count: {list.Count}");
Debug.Log("------------------");
list.RemoveAt(0);
for (int i = 0; i < list.Count; i++)
{
Debug.Log($"list[{i}]: {list[i]}");
}
Debug.Log($"list.Count: {list.Count}");
}
}
위 코드는 ArrayList 사용 예시이다. ArrayList는 배열과 흡사한 구조를 가지는 컬렉션이다.
ArrayList의 장점은 요소에 접근할 때는 첨자 연산자 []를 이용하고, 원하는 위치에 데이터를 추가하거나 삭제하는것이 자유롭다. 또한 배열과 다르게 크기를 미리 정해놓을 필요가 없고 데이터를 추가하거나 삭제했을 때 자동으로 용량이 늘어나거나 줄어든다.
또한 살펴보아야 할 게 리스트에 데이터를 추가할 때 자료형의 종류에 상관없이 추가가 가능하다는 것을 볼 수 있다. 그 이유는 Add()에 들어가는 매개변수가 모든 자료형을 나타낼 수 있는 Object 자료형이기 때문이다.
Object 타입은 사용하기 편리하지만, 박싱과 언박싱이 일어남으로 성능적으로 좋은 편은 아니다.
단점은 사용하기가 편리하지만 속도가 느리다.
ArrayList에 대한 자세한 정의, 속성, 메서드 참조 : https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.arraylist?view=net-9.0
ArrayList 클래스 (System.Collections)
필요에 따라 크기가 동적으로 증가하는 배열을 사용하여 IList 인터페이스를 구현합니다.
learn.microsoft.com
Hashtable
void HashtableEx()
{
Hashtable hash = new Hashtable();
hash["Book"] = "책";
hash["Cook"] = "요리";
hash[1.0f] = 15;
hash[5092] = true;
Debug.Log(hash["Book"]);
Debug.Log(hash["Cook"]);
Debug.Log(hash[1.0f]);
Debug.Log(hash[5092]);
}
Hashtable은 Key에 값을 저장한다. 쉽게 말해 사전이라고 생각하면 된다. 그 값을 확인할때는 key를 통해서 그 key에 저장된 데이터를 불러온다. hashtable도 ArrayList와 같이 키와 값을 Object 타입으로 받는다. ArrayList에 비해 상대적으로 속도가 빠르다.
Hashtable 상세한 내용 참조 : https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.hashtable?view=net-9.0
Hashtable 클래스 (System.Collections)
키의 해시 코드에 따라 구성된 키/값 쌍의 컬렉션을 나타냅니다.
learn.microsoft.com
Stack
스택(Stack)은 후입선출(LIFO : Last In First Out)방식의 자료 구조이다.
void StackEx()
{
Stack stack = new Stack();
stack.Push(1); // 1 삽입 -> 현재 stack : 1
stack.Push(2); // 2 삽입 -> 현재 stack : 1 2
stack.Push(3); // 3 삽입 -> 현재 stack : 1 2 3
stack.Pop(); // 제일 마지막에 삽입된(제일 위에 있는) 값 3 추출 -> 현재 stack : 1 2
stack.Peek(); // 제일 위에 있는 값이 무엇인지 확인 2 -> 현재 stack : 1 2
stack.Pop(); // 2 추출 -> 현재 stack : 1
stack.Pop();
}
스택에 대해서는 추후에 자료 구조를 자세히 포스팅할 예정이므로 간단하게 이해해보자.
스택은 간단하게 말하면 차곡차곡 쌓아 올린 자료 구조 형태이다. 스택도 위 컬렉션과 같이 Object 타입이다. 스택에 가장 최근에 들어온 값(제일 위에 있는 값)을 top이라 칭한다.
Push() : 스택에 데이터를 삽입한다. 삽입된 데이터는 가장 위(top)에 존재한다.
Pop() : 스택 top을 추출한다.
Peek() : 스택 top을 확인한다. (꺼내지는 않고 확인만 한다)
Queue
큐(Queue)는 선입선출(FIFO : First In First Out)방식의 자료구조 이다.
void QueueEx()
{
Queue queue = new Queue();
queue.Enqueue(1); // 1 삽입 -> 현재 queue : 1
queue.Enqueue(2); // 2 삽입 -> 현재 queue : 1 2
queue.Enqueue(3); // 3 삽입 -> 현재 queue : 1 2 3
queue.Dequeue(); // 제일 처음에 삽입된 값 1 추출 -> 현재 queue : 2 3
queue.Peek(); // 제일 처음 값 확인 -> 현재 queue : 2 3
queue.Dequeue(); // 2 추출 -> 현재 queue : 3
}
큐(queue)도 추후에 자세히 포스팅할 예정이다.
큐는 간단하게 말하면 줄을 서 있는 느낌이다. 음식점을 예로 들었을 때 가장 먼저 줄을 선 사람이 먼저 들어가는 구조이다. 큐도 위 컬렉션과 같이 Object 타입이다.
Enqueue() : 삽입
Peek() : 확인
Dequeue() : 추출
스택과 큐에 자세한 내용 참조 : https://devuna.tistory.com/22
[자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 예시
[자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 예시/ 실생활 활용 스택 (STACK)이란? 📌 스택의 개념 스택(stack)이란 쌓아 올린다는 것을 의미한다. 따라서 스택 자료구조라는 것은 책을 쌓는 것
devuna.tistory.com
간단하게 컬렉션에 대해 알아보았다. 추후에 큐와 스택에 대해서는 자세한 구조와 흐름이 어떻게 되는지 다룰 예정이다.
아래 동영상이 여태까지 포스팅했던 문법과 개념을 이해하는데 너무 쉽게 설명해준다.
동영상 참조 : https://www.youtube.com/watch?v=xO8bNLfCSMU&t=868s
'Unity C# > 개념 및 문법 정리' 카테고리의 다른 글
[Unity C#] 객체 지향 (클래스, 추상화) (1) | 2025.01.13 |
---|---|
[Unity C#] C# 2.0 제네릭(Generic) 기초 (0) | 2025.01.11 |
[Unity C#] 형변환 (Type Casting) (0) | 2025.01.10 |
[Unity C#] 메모리 구조와 GC(Garbage Collection) (1) | 2025.01.09 |
[Unity C#] 의존성 주입 (Dependency Injection) DI (1) | 2025.01.05 |