일반화 클래스
class MyList<T>
{
T[] arr = new T[10];
public T GetItem(int i)
{
return arr[i];
}
}
MyList<int> myIntList = new MyList<int>();
int item = myIntList.GetItem(0);
형식 매개변수의 제약
class 클래스이름<T> where T : @@@
- where T : struct // T는 값 형식이어야 한다.
- where T : class // T는 참조 형식이어야 한다.
- where T : new() // T는 어떤 인자도 받지 않는 기본 생성자여야 한다.
- where T : 기반클래스이름 // T는 기반 클래스의 파생 클래스여야 한다.
- where T : 인터페이스이름 // T는 인터페이스를 구현해야만 한다. 여러 개의 인터페이스를 작성할 수 있다.
- where T : U // 또 다른 형식매개변수 U로부터 상속받은 클래스여야 한다.
일반화컬렉션
using System.Collections.Generic // 일반화컬렉션을 사용한다는 선언.
- 컬렉션 클래스들은 object 형식 기반으로 박싱/언박싱이 일어나 성능에 좋지 않다.
- 반면 일반화 컬렉션은 일반화에 기반해서 만들어져 있기 때문에 컴파일할 때 컬렉션에서 사용할 형식이 결정되기 때문에 쓸데없는 형식 변환을 일으키지 않고 잘못된 형식의 객체를 담게 될 위험도 피할 수 있다.
- 일반화 컬렉션은 형 변환이 일어나지 않도록 데이터 타입을 지정해준다. 따라서 정해진 데이터 타입만 사용 가능하다.
- 대표적으로 LIST< T>, Queue< T >, Stack< T >, Dictionary<TKey, TValue> 가 있다.
LIST< T >
List<string> ListGen = new List<string>();
ListGen.Add("List");
- 형식 매개변수를 요구한다는 점만 다를 뿐, 비 일반화 클래스인 ArrayList와 동일한 기능을 하며 사용법은 동일하다.
Queue< T >
Queue<int> QueueGen = new Queue<int>();
QueueGen.Enqueue(1);
- 형식 매개변수를 요구한다는 점만 다를 뿐, 비 일반화 클래스인 Queue와 사용법은 동일하다.
Stack< T >
Stack<int> StackGen = new Stack<int>();
StackGen.Push(1);
- 형식 매개변수를 요구한다는 점만 다를 뿐, 비 일반화 클래스인 Stack과 사용법은 동일하다.
Dictionary<TKey, TValue>
Dictionary<string, string> dic = new Dictionary<string, string>()
{
["구름"] = "cloud",
["백조"] = "swan",
["콩"] = "bean"
};
WriteLine(dic["구름"]);
WriteLine(dic["백조"]);
WriteLine(dic["콩"]);
- Dictionary<TKey, TValue>는 Key와 Value 형태로 이루어진 Hashtable의 일반화 버전이다.
'C#' 카테고리의 다른 글
C#) delegate 대리자 (0) | 2022.01.14 |
---|---|
C#) property (0) | 2022.01.13 |
C#) interface 인터페이스 (1) | 2022.01.13 |
C#) var & dynamic & object (0) | 2022.01.13 |