Unity C#/개념 및 문법 정리

[Unity C#] C# 1.0 컬렉션

routine96 2025. 1. 10. 23:10

 

컬렉션이란

같은 성격을 가지는 데이터 모음을 담는 자료 구조로 사용하기 편리하지만 박싱, 언박싱이 일어나기 떄문에 성능상으론 좋지 않은 편이다. 그렇다면 왜 만들었을까? 컬렉션은 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