Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] 일반화 컬렉션 (Generic Collection) 본문

Programming/C#

[Programming/C#] 일반화 컬렉션 (Generic Collection)

scii 2020. 9. 20. 02:55

System.Collections 의 컬렉션들은 어떤 형식이든 object 형식으로 상속받고 있으므로 object 형식으로 형식 변환이 가능하다. 이것은 바로 이점을 활용하기 위해 만들어진 자료 구조이다. 컬렉션 객체에 int 형 데이터, string 형 데이터, FooClass 의 객체도 담을 수 있다.
하지만 컬렉션은 object 형식에 기반하고 있기 때문에 태생적으로 성능 문제를 안고 있다. 컬렉션의 요소에 접근할 때마다 형식 변환이 주구장창 일어나기 때문이다.

"일반화 컬렉션 (System.Collections.Generic)" 은 object 형식 기반의 컬렉션이 갖고 있던 문제를 말끔히 해결한다. 일반화 컬렉션은 말 그대로 일반화에 기반해서 만들어져 있기 때문에 컴파일할 때 컬렉션에서 사용할 형식이 결정되고, 쓸데없는 형식 변환을 일으키지 않는다. 또한 잘못된 형식의 객체를 담게 될 위험도 피할 수 있다.

일반화 컬렉션들을 모아놓은 System.Collections.Generic 네임스페이스는 비주얼 스튜디오에서 프로젝트를 생성하면 기본적으로 사용하도록 using 문이 선언되어 있다.

System.Collections.Generic 네임스페이스는 다양한 컬렉션 클래스를 담고 있다. 그 중 List<T>, Queue<T>, Stack<T>, Dictionary<TKey, TValue> 를 소개한다.

List<T>

List<T> 클래스는 비일반화 클래스인 ArrayList와 같은 기능을 하며, 사용법 또한 동일하다. 차이점이라면 List<T> 클래스는 인스턴스를 만들 때 형식 매개 변수를 필요로 한다는 것과 한 컬렉션에 "아무" 형식의 객체나 집어 넣을 수 있었던 ArrayList와는 달리 List<T> 는 형식 매개 변수로 입력한 형식 외에는 입력을 허용하지 않는다는 점이다.

using System;
using System.Collections.Generic;

namespace test
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            List<int> list = new List<int>();
            for (int i = 0; i < 5; i++)
            {
                list.Add(i);
            }

            foreach (int element in list)
            {
                Console.Write($"{element} ");
            }
            Console.WriteLine();

            list.RemoveAt(2);

            foreach (int element in list)
            {
                Console.Write($"{element} ");
            }
            Console.WriteLine();

            list.Insert(2, 2);

            foreach (int element in list)
            {
                Console.Write($"{element} ");
            }
            Console.WriteLine();
        }
    }
}


/* 결과

0 1 2 3 4 
0 1 3 4 
0 1 2 3 4 

*/

Queue<T>

Queue<T> 클래스는 형식 매개 변수를 요구한다는 점만 제외하면 Queue의 기능과 사용 방법은 동일하다.

using System;
using System.Collections.Generic;

namespace test
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            Queue<int> queue = new Queue<int>();

            for (int i = 0; i < 5; i++)
            {
                queue.Enqueue(i);
            }

            while (queue.Count > 0)
            {
                Console.WriteLine(queue.Dequeue());
            }
        }
    }
}


/* 결과

0
1
2
3
4

*/

Stack<T>

Stack<T> 는 형식 매개 변수를 요구한다는 점만 제외하면 Stack의 기능과 사용 방법은 동일하다.

using System;
using System.Collections.Generic;

namespace test
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            Stack<int> stack = new Stack<int>();

            for (int i = 0; i < 5; i++)
            {
                stack.Push(i);
            }

            while (stack.Count > 0)
            {
                Console.WriteLine(stack.Pop());
            }
        }
    }
}


/* 결과

4
3
2
1
0

*/

Dictionary<TKey, TValue>

Dictionary<TKey, TValue>는 HashTable의 일반화 버전이다. Dictionary<TKey, TValue>는 형식 매개 변수 두 개를 요구한다. 형식 매개 변수 이름에서 알 수 있듯이 TKey는 Key, TValue는 Value를 위한 형식이다.

using System;
using System.Collections.Generic;

namespace test
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            Dictionary<string, int> dict = new Dictionary<string, int>();

            dict["one"] = 1;
            dict["two"] = 2;
            dict["three"] = 3;
            dict["four"] = 4;
            dict["five"] = 5;
            
            Console.WriteLine(dict["one"]);
            Console.WriteLine(dict["two"]);
            Console.WriteLine(dict["three"]);
            Console.WriteLine(dict["four"]);
            Console.WriteLine(dict["five"]);
        }
    }
}


/* 결과

1
2
3
4
5

*/
Comments