본문 바로가기

프로그램/유니티 C# 강좌

[유니티 C# 강좌] 21. 제네릭 컬렉션(General Collection)

728x90
반응형

1. 컬렉션(Collection) 클래스

프로그래밍에서 데이터(자료)를 효율적으로 관리하는 것은 아주 중요한 일입니다.

자료구조란, 데이터를 구조적으로 표현하고, 구현하는 중요한 알고리즘입니다.

 

컬렉션(Collection) C#에서 지원하는 자료구조 클래스입니다.

컬렉션의 종류는 ArrayList, Queue, Stack, Hashtable 등이 있습니다.

 

컬렉션은 object 형식을 사용하여 데이터를 관리하기 때문에, 박싱(Boxing)과 언방식(Unboxing)이 발생합니다.

그래서 컬렉션을 많이 사용하게 되면, 프로그램의 성능 저하가 옵니다.

 

성능 이유로 현재 C#에서는 컬렉션은 잘 사용하지 않습니다.

 

 

2. 제네릭 컬렉션(General Collection) 클래스

컬렉션의 성능 문제 때문에 대신 사용하는 것이 제네릭 컬렉션입니다.

제네릭 컬렉션은 데이터 형식을 일반화하여 사용하기 때문에 컬렉션에 비해 성능의 문제가 적습니다.

제네릭 컬렉션은 List<T>, Dictionary<T> , Queue<T>, Stack<T> 등의 클래스가 있습니다.

 

제네릭 컬렉션은 using 지시문으로  System.Collections.Generic를 선언해 주어야 하는데, 유니티에서 새 C# 스크립트를 만들면, 자동적으로 선언되어 있습니다.

 

네임스페이스

using System.Collections.Generic; 

 

2.1 List<T> 클래스

 

List<T> 클래스는 배열 크기를 바꿀 수 있는 가변배열입니다.

기존의 배열은 미리 크기를 정하고 사용해야 하나, List<T>를 사용하게 되면 자유롭게 배열의 크기를 조절할 수 있습니다.

Add, Insert 메소드를 사용하여 데이터를 저장할 수 있고, Remove군 메소드를 통하여 데이터를 지울 수 있습니다

 

List<T> 클래스 속성입니다.

 

속성

설명

Capacity

크기를 조정하지 않고 내부 데이터 구조가 보유할 수 있는 전체 요소 수를 가져오거나 설정합니다.

Count

List에 있는 요소의 개수를 가져옵니다.

Item[Int32]

지정한 인덱스에 있는 요소를 가져오거나 설정합니다

 

List<T> 클래스 메서드는입니다.

 

메서드

설명

Add(T)

List<T>의 끝에 개체를 추가합니다.

AddRange(IEnumerable<T>)

지정된 컬렉션의 요소를 List<T>의 끝에 추가합니다.

AsReadOnly()

현재 컬렉션에 대한 읽기 전용 ReadOnlyCollection<T> 래퍼를 반환합니다.

BinarySearch(Int32, Int32, T, IComparer<T>)

지정된 비교자를 사용하여 정렬된 List<T>의 요소 범위에서 요소를 검색하고 요소의 인덱스(0부터 시작)를 반환합니다.

BinarySearch(T)

기본 비교자를 사용하여 정렬된 전체 List<T>에서 요소를 검색하고 요소의 인덱스(0부터 시작)를 반환합니다.

BinarySearch(T, IComparer<T>)

지정된 비교자를 사용하여 정렬된 전체 List<T>에서 요소를 검색하고 요소의 인덱스(0부터 시작)를 반환합니다.

Clear()

List<T>에서 모든 요소를 제거합니다.

Contains(T)

List<T>에 요소가 있는지 여부를 확인합니다.

ConvertAll<TOutput>(Converter<T,TOutput>)

현재 List<T>의 요소를 다른 형식으로 변환하고 변환된 요소를 포함하는 목록을 반환합니다.

CopyTo(Int32, T[], Int32, Int32)

대상 배열의 지정된 인덱스에서 시작하여 List<T>에 있는 일련의 요소를 호환되는 1차원 배열에 복사합니다.

CopyTo(T[])

대상 배열의 처음부터 시작하여 전체 List<T>을 호환되는 1차원 배열에 복사합니다.

CopyTo(T[], Int32)

대상 배열의 지정된 인덱스에서 시작하여 전체 List<T>을 호환되는 1차원 배열에 복사합니다.

Equals(Object)

지정한 개체가 현재 개체와 같은지를 확인합니다.

Exists(Predicate<T>)

지정된 조건자에 정의된 조건과 일치하는 요소가 List<T>에 포함되어 있는지 여부를 확인합니다.

Find(Predicate<T>)

지정된 조건자에 정의된 조건과 일치하는 요소를 검색하고 전체 List<T>에서 처음으로 검색한 요소를 반환합니다.

FindAll(Predicate<T>)

지정한 조건자에 정의된 조건과 일치하는 모든 요소를 검색합니다.

FindIndex(Int32, Int32, Predicate<T>)

지정된 조건자에 정의된 조건과 일치하는 요소를 검색하고 지정된 인덱스부터 시작하여 지정된 수의 요소를 포함하는 List<T>의 요소 범위에서 일치하는 요소 중 첫 번째 요소의 인덱스(0부터 시작)를 반환합니다.

FindIndex(Int32, Predicate<T>)

지정된 조건자에 정의된 조건과 일치하는 요소를 검색하여 지정된 인덱스에서 마지막 요소로 확장하는 List<T>의 요소 범위에서 일치하는 요소 중 첫 번째 요소의 인덱스(0부터 시작)를 반환합니다.

FindIndex(Predicate<T>)

지정된 조건자에 정의된 조건과 일치하는 요소를 검색하여 전체 List<T>에서 일치하는 요소 중 첫 번째 요소의 인덱스(0부터 시작)를 반환합니다.

FindLast(Predicate<T>)

지정된 조건자에 정의된 조건과 일치하는 요소를 검색하고 전체 List<T>에서 마지막으로 검색한 요소를 반환합니다.

FindLastIndex(Int32, Int32, Predicate<T>)

지정한 조건자에 정의된 조건과 일치하는 요소를 검색하여 지정한 수의 요소가 들어 있고 지정한 인덱스에서 끝나는 List<T>의 요소 범위에서 일치하는 요소 중 마지막 요소의 인덱스(0부터 시작)를 반환합니다.

FindLastIndex(Int32, Predicate<T>)

지정된 조건자에 정의된 조건과 일치하는 요소를 검색하여 첫 번째 요소에서 지정된 인덱스로 확장하는 List<T>의 요소 범위에서 일치하는 요소 중 마지막 요소의 인덱스(0부터 시작)를 반환합니다.

FindLastIndex(Predicate<T>)

지정한 조건자에 정의된 조건과 일치하는 요소를 검색하여 전체 List<T>에서 일치하는 요소 중 마지막 요소의 인덱스(0부터 시작)를 반환합니다.

ForEach(Action<T>)

List<T>의 각 요소에 대해 지정된 작업을 수행합니다.

GetEnumerator()

List<T>을 통해 반복하는 열거자를 반환합니다.

GetHashCode()

기본 해시 함수로 작동합니다.

GetRange(Int32, Int32)

소스 List<T>에 있는 일련의 요소에 대한 단순 복사본을 만듭니다.

GetType()

현재 인스턴스의 Type을 가져옵니다.

IndexOf(T)

지정된 개체를 검색하고, 전체 List<T>에서 처음으로 검색한 개체의 인덱스(0부터 시작)를 반환합니다.

IndexOf(T, Int32)

지정된 개체를 검색하고, 지정된 인덱스부터 마지막 요소까지 포함하는 List<T>의 요소 범위에서 처음으로 검색한 개체의 인덱스(0부터 시작)를 반환합니다.

IndexOf(T, Int32, Int32)

지정된 개체를 검색하고, 지정된 인덱스에서 시작하여 지정된 수의 요소를 포함하는 List<T>의 요소 범위에서 처음으로 검색한 개체의 인덱스(0부터 시작)를 반환합니다.

Insert(Int32, T)

List<T>에서 지정한 인덱스에 요소를 삽입합니다.

InsertRange(Int32, IEnumerable<T>)

List<T>의 지정된 인덱스에 컬렉션의 요소를 삽입합니다.

LastIndexOf(T)

지정된 개체를 검색하고, 전체 List<T>에서 마지막으로 검색한 개체의 인덱스(0부터 시작)를 반환합니다.

LastIndexOf(T, Int32)

지정된 개체를 검색하고, 첫 번째 요소부터 지정된 인덱스까지 포함하는 List<T>의 요소 범위에서 마지막으로 검색한 개체의 인덱스(0부터 시작)를 반환합니다.

LastIndexOf(T, Int32, Int32)

지정된 개체를 검색하며, 지정된 수의 요소를 포함하고 지정된 인덱스에서 끝나는 List<T>의 요소 범위에서 마지막으로 검색한 개체의 인덱스(0부터 시작)를 반환합니다.

MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

Remove(T)

List<T>에서 처음 발견되는 특정 개체를 제거합니다.

RemoveAll(Predicate<T>)

지정된 조건자로 정의된 조건과 일치하는 모든 요소를 제거합니다.

RemoveAt(Int32)

List<T>의 지정된 인덱스에 있는 요소를 제거합니다.

RemoveRange(Int32, Int32)

List<T>에서 요소의 범위를 제거합니다.

Reverse()

전체 List<T>에서 요소의 순서를 반대로 바꿉니다.

Reverse(Int32, Int32)

지정된 범위에서 요소의 순서를 반대로 바꿉니다.

Sort()

기본 비교자를 사용하여 전체 List<T>의 요소를 정렬합니다.

Sort(Comparison<T>)

지정된 List<T> 사용하여 전체 Comparison<T> 요소를 정렬합니다.

Sort(IComparer<T>)

지정된 비교자를 사용하여 전체 List<T>에 있는 요소를 정렬합니다.

Sort(Int32, Int32, IComparer<T>)

지정된 비교자를 사용하여 List<T>의 요소 범위에 있는 요소를 정렬합니다.

ToArray()

List<T>의 요소를 새 배열에 복사합니다.

ToString()

현재 개체를 나타내는 string 반환합니다.

TrimExcess()

List<T>에 있는 요소의 실제 수가 임계값보다 작은 경우 용량을 요소 수로 설정합니다.

TrueForAll(Predicate<T>)

List<T>의 모든 요소가 지정된 조건자에 정의된 조건과 일치하는지 여부를 확인합니다.

 

using System.Collections.Generic; 
using UnityEngine; 

public class ListExample : MonoBehaviour 
{ 
    void Start() 
    { 
        List<string> list = new List<string>(); 

        // 동적 추가 
        list.Add("1번째"); 
        list.Add("2번째"); 
        list.Add("3번째"); 
        list.Add("4번째"); // 1번째 2번째 3번째 4번째 

        Debug.Log(list[1]); // 출력 : 2번째 
        Debug.Log(list.Capacity); // 출력 : 4 
        Debug.Log(list.Count); // 출력 : 4 

        list.RemoveAt(2); // 1번째 3번째 4번째 
        list.Remove("4번째"); // 1번째 3번째 
        list.Insert(0, "새 0번째"); // "새 0번째 1번째 3번째 
    } 
}

 

 

2.2 Dictionary<T>

 

Dictionary은 키(Key)와 값(Value)을 한쌍으로 저장되는 자료 구조입니다.

키 값을 유일해야 하며, 키 값에서 값을 찾기 때문에 검색 할 때 빠른 검색을 할 수 있습니다.

 

Dictionary<T> 클래스 속성입니다.

 

속성

설명

Comparer

사전에 대한 키의 일치 여부를 확인하는 데 사용되는 IEqualityComparer<T>을 가져옵니다.

Count

Dictionary<TKey,TValue>에 포함된 키/값 쌍의 수를 가져옵니다.

Item[TKey]

지정된 키와 연결된 값을 가져오거나 설정합니다.

Keys

Dictionary<TKey,TValue>의 키를 포함하는 컬렉션을 가져옵니다.

Values

Dictionary<TKey,TValue>의 값을 포함하는 컬렉션을 가져옵니다.

 

Dictionary<T> 클래스 메서드입니다.

 

메서드

설명

Add(TKey, TValue)

지정된 키와 값을 사전에 추가합니다.

Clear()

Dictionary<TKey,TValue>에서 모든 키와 값을 제거합니다.

ContainsKey(TKey)

Dictionary<TKey,TValue>에 지정한 키가 포함되어 있는지 여부를 확인합니다.

ContainsValue(TValue)

Dictionary<TKey,TValue>에 특정 값이 포함되어 있는지 여부를 확인합니다.

Equals(Object)

지정한 개체가 현재 개체와 같은지를 확인합니다.

GetEnumerator()

Dictionary<TKey,TValue>을 통해 반복하는 열거자를 반환합니다.

GetHashCode()

기본 해시 함수로 작동합니다.

GetObjectData(SerializationInfo, StreamingContext)

ISerializable 인터페이스를 구현하고 Dictionary<TKey,TValue> 인스턴스를 직렬화하는  필요한 데이터를 반환합니다.

GetType()

현재 인스턴스의 Type을 가져옵니다.

MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

OnDeserialization(Object)

ISerializable 인터페이스를 구현하고, deserialization이 완료되면 deserialization 이벤트를 발생시킵니다.

Remove(TKey)

Dictionary<TKey,TValue>에서 지정한 키가 있는 값을 제거합니다.

ToString()

현재 개체를 나타내는 string 반환합니다.

TryGetValue(TKey, TValue)

지정된 키와 연결된 값을 가져옵니다.

 

using System.Collections.Generic; 
using UnityEngine; 

public class DictionaryExample : MonoBehaviour 
{ 
    void Start() 
    { 
        Dictionary<int, string> dictionary = new Dictionary<int, string>(); 
        dictionary.Add(101, "1 번째"); 
        dictionary.Add(102, "2 번째"); 
        dictionary.Add(103, "3 번째"); 
        dictionary.Add(104, "4 번째"); 

        foreach (var item in dictionary) 
        { 
            Debug.Log($"{item.Key} {item.Value}"); // 출력 : 101 1 번째 102 2 번째 103 3 번째 104 4 번째 
        } 

        foreach (var key in dictionary.Keys) 
        { 
            Debug.Log(key); // 출력 : 101 102 103 104 
        } 

        foreach (var value in dictionary.Values) 
        { 
            Debug.Log(value); // 출력 : 1 번째 2 번째 3 번째 4 번째 
        } 
                
        Debug.Log($"{dictionary[101]}"); // 출력 : 1 번째, 101는 키 
    } 
}

 

 

2.3 Stack<T> 클래스

 

Stack<T> 클래스는 후입선출(LIFO, Last In First Out) 자료 구조입니다.

후입선출이란 나중에 들어 온 데이터가 먼저 출력된다는 뜻입니다.

 

코더제로 유니티 C# 강좌 제네릭 컬렉션(General Collection) Stack(스택)
그림. Queue(큐)

 

Stack<T> 클래스 속성입니다.

 

속성

설명

Count

List에 있는 요소의 개수를 가져옵니다.

 

Stack<T> 클래스 메서드입니다.

 

메서드

설명

Clear()

Stack<T>에서 개체를 모두 제거합니다.

Contains(T)

Stack<T>에 요소가 있는지 여부를 확인합니다.

CopyTo(T[], Int32)

지정된 배열 인덱스에서 시작하는 기존 1차원 Stack<T> Array 복사합니다.

Equals(Object)

지정한 개체가 현재 개체와 같은지를 확인합니다.

GetEnumerator()

Stack<T>에 대한 열거자를 반환합니다.

GetHashCode()

기본 해시 함수로 작동합니다.

GetType()

현재 인스턴스의 Type을 가져옵니다.

MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

Peek()

Stack<T>의 맨 위에서 개체를 제거하지 않고 반환합니다.

Pop()

Stack<T>의 맨 위에서 개체를 제거하고 반환합니다.

Push(T)

개체를 Stack<T>의 맨 위에 삽입합니다.

ToArray()

Stack<T>을 새 배열에 복사합니다.

ToString()

현재 개체를 나타내는 string 반환합니다.

TrimExcess()

Stack<T>의 실제 요소 수가 현재 용량의 90% 미만인 경우 용량을 이 값으로 설정합니다.

 

using System.Collections.Generic; 
using UnityEngine; 

public class StackExample : MonoBehaviour 
{ 
    void Start() 
    { 
        Stack<string> stack = new Stack<string>(); 
        stack.Push("1 번째"); 
        stack.Push("2 번째"); 
        stack.Push("3 번째"); 

        foreach (var item in stack) 
        { 
            Debug.Log(item); // 3 번째 2 번째 1 번째  
        } 

        Debug.Log(stack.Peek().ToString()); // 3 번째  

        stack.Pop(); 

        foreach (var item in stack) 
        { 
            Debug.Log(item); // 2 번째 1 번째  
        } 
    } 
}

 

 

2.4 Queue<T> 클래스

 

Queue<T> 클래스는 선입선출(FIFO, First In First Out) 자료 구조입니다.

선입선출은 먼저 들어온 데이터가 먼저 출력된다는 뜻입니다.

 

코더제로 유니티 C# 강좌 제네릭 컬렉션(General Collection) Queue(큐)
그림. Queue(큐)

 

Queue<T> 클래스 속성입니다.

 

속성

설명

Count

List에 있는 요소의 개수를 가져옵니다.

 

Queue<T> 클래스 메서드입니다.

 

메서드

설명

Clear()

Queue<T>에서 개체를 모두 제거합니다.

Contains(T)

Queue<T>에 요소가 있는지 여부를 확인합니다.

CopyTo(T[], Int32)

Queue<T> 요소를 지정한 배열 인덱스에서 시작하여 기존의 1차원 Array 복사합니다.

Dequeue()

Queue<T>의 시작 부분에서 개체를 제거하고 반환합니다.

Enqueue(T)

Queue<T>의 끝에 개체를 추가합니다.

Equals(Object)

지정한 개체가 현재 개체와 같은지를 확인합니다.

GetEnumerator()

Queue<T>을 통해 반복하는 열거자를 반환합니다.

GetHashCode()

기본 해시 함수로 작동합니다.

GetType()

현재 인스턴스의 Type을 가져옵니다.

MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

Peek()

Queue<T>의 시작 부분에서 개체를 제거하지 않고 반환합니다.

ToArray()

Queue<T> 요소를 새 배열에 복사합니다.

ToString()

현재 개체를 나타내는 string 반환합니다.

TrimExcess()

Queue<T>의 실제 요소 수가 현재 용량의 90% 미만인 경우 용량을 이 값으로 설정합니다.

 

using System.Collections.Generic; 
using UnityEngine; 

public class QueueExample : MonoBehaviour 
{ 
    void Start() 
    { 
        Queue<string> queue = new Queue<string>(); 

        queue.Enqueue("1 번째"); 
        queue.Enqueue("2 번째"); 
        queue.Enqueue("3 번째"); 

        foreach (var item in queue) 
        { 
            Debug.Log(item); // 1 번째 2 번째 3 번째  
        } 

        Debug.Log(queue.Peek().ToString()); // 1 번째  

        queue.Dequeue(); 

        foreach (var item in queue) 
        { 
            Debug.Log(item); // 2 번째 3 번째  
        } 
    } 
}

 

728x90
반응형