일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 구조체
- Python
- Data Structure
- c# 윈폼
- Flutter
- c#
- Algorithm
- git
- 도커
- 다트 언어
- jupyter
- HTML
- c# winform
- 포인터
- github
- Houdini
- 깃
- C# delegate
- c# 추상 클래스
- Unity
- C++
- vim
- c언어
- gitlab
- C언어 포인터
- dart 언어
- 플러터
- docker
- 유니티
- jupyter lab
- Today
- Total
nomad-programmer
[Programming/C#] 일반화 컬렉션 (Generic Collection) 본문
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
*/
'Programming > C#' 카테고리의 다른 글
[Programming/C#] 예외 처리 (0) | 2020.09.21 |
---|---|
[Programming/C#] 일반화 클래스 : IEnumerable<T>, IEnumerator<T> (0) | 2020.09.20 |
[Programming/C#] 일반화 프로그래밍 : 형식 매개 변수 제약 (0) | 2020.09.19 |
[Programming/C#] 일반화 프로그래밍 (Generic Programming) (0) | 2020.09.18 |
[Programming/C#] 인덱서 (Indexer) (0) | 2020.09.15 |