컬렉션은 데이터를 호율적으로 저장, 검색, 조작할 수 있는 다양한 기능을 제공한다. 주요한 컬렉션 클래스들은 닷넷 프레임워크의 일부로 제공되며, System.Collections 및 System.Collections.Generic 네임스페이스에 정의되어 있다.
ArrayList : 필요에 따라 크기가 동적으로 증가하는 개체 배열
Hashtable : 키의 해시 코드에 따라 구성된 키/값 쌍의 컬렉션(dictionary와 hashtable의 차이)
Queue : FIFO(선입선출) 방식의 개체 컬렉션
Stack : LIFO(후입선출) 방식의 개체 컬렉션
참고
C# 컬렉션
Array
List
ArrayList
일반화 프로그램(제네릭 프로그램)은 데이터 형식을 일반화하는 기법이다. 제네릭을 사용하면 다양한 형식의 데이터를 처리하는 메소드와 클래스를 작성할 수 있으며 컴파일 시점에서 안정성을 보장한다.
제네릭 타입(Generic Type)을 사용하면 int, float, double 등 특정 데이터 타입을 확정하지 않고 데이터 타입 자체를 타입 파라미터(Type Parameter)로 받아 정의할 수 있다.
① Generic : 박싱과 언박싱이 발생하지 않음. 성능면에서 훨씬 좋음.
② 데이터를 저장하는 시점에 데이터 타입을 지정(박싱 발생하지 않음)
③ 데이터를 사용하는 시점에 데이터 타입을 지정했으므로 형변환(언박싱) 하지 않아도 됨.
④ 자신이 지정한 타입만 저장할 수 있다. (데이터 타입을 미리 지정해둠)
⑤ List, Dictionary<TKey, TValue>, Queue, Stack이 제네릭에 해당된다.
List : 가변배열 제네릭 클래스.
LinkedList : 이중 연결 리스트 제네릭 클래스
Queue : 자료구조 큐.(FIFO) 제네릭 클래스
Stack : 자료구조 스택.(LIFO) 제네릭 클래스.
Dictionary<TKey,TValue> : 자료구조 해시 테이블. 제네릭 클래스
제네릭 클래스의 생성자에서 맴버변수의 값을 초기화 할 수 있다.
public class GenericClass<T>
{
public GenericClass() { }
public GenericClass(T t)
{
objMember = t;
}
public T objMember { get; set; }
}
static void Main(string[] args)
{
GenericClass<int> genericObj = new GenericClass<int>(10);
Console.WriteLine(genericObj.objMember); // 10
멤버 변수에 타입에 따라 기본값을 할당해야 하는 경우 default 연산자 를 사용할 수 있다.
숫자형은 0, 문자형은 ""이 할당된다.
public class GenericClass<T>
{
public GenericClass()
{
objMember = default(T);
}
public T objMember { get; set; }
}
static void Main(string[] args)
{
GenericClass<int> genericObj = new GenericClass<int>();
Console.WriteLine(genericObj.objMember); // 0
| 제약 조건 | 내용 |
|---|---|
| where T : struct | T는 null을 허용하지 않는 값 형식 |
| where T : class | T는 참조 형식 |
| where T : new() | T는 매개 변수가 없는 public 생성자가 있어야 한다. 다른 제약 조건과 함께 사용되는 경우 new() 제약 조건을 마지막에 지정해야 한다. |
| where T : notnull | T는 null이 아닌 형식이어야 한다. |
| where T : unmanaged | T는 null이 아닌 비관리형 형식이어야 한다. |
| where T : <base class name> | T는 지정된 기본 클래스이거나 이 클래스에서 파생된 클래스여야 한다. |
| where T : <interface name> | T는 지정된 기본 인터페이스이거나 이 인터페이스에서 파생된 유형이여야 한다. |
| where T : U | U는 인터페이스, 추상 클래스 또는 일반 클래스가 될 수 있으며, T는 U에서 상속되어야 한다. |
추가로
where T : Delegate(C# 7.3 추가), where T : Enum(C# 7.3 추가), where T : default(C# 9.0 추가)