2025-04-25
<T> <K> <V> : 타입 매개 변수 요소 타입을 일반화한 타입List<T>List<int>List<string>Person만 다루는 리스트 : List<Person>⇒ 다양한 자료혀엥 적용될 수 있는 일반화된 타입 매개변수로 클래스나 메소드를 작성하는 기법이다.
💡 제네릭은 사용할 자료형을 매개변수로 전달받는다.
public class IntStack
{
int[] items;
int count;
public void Push(int item) { ... }
public int Pop() { ... }
}
public class StringStack
{
string[] items;
int count;
public void Push(string item) { ... }
public string Pop() { ... }
}
⬇
public class Stack<T>
{
T[] items;
int count;
public void Push(T item) { ... }
public T Pop() { ... }
}
...
Stack<int> istack = new Stack<int>();
istack.Push(3);
int x = istack.Pop();
Stack<string> sstack = new Stack<string>();
sstack.Push("C#");
string s = sstack.Pop();
클래스나 인터페이스 선언부에 일반화된 타입을 추가한다.
public class MyClass<T>
{
T val;
void Set(T a)
{
val = a;
}
T Get()
{
return val;
}
}
Tval의 타입은 TT 타입의 값 a를 val에 지정T 타입의 값 val 리턴제네릭 타입의 클래스에 구체적인 타입을 대입하여 객체를 생성한다.
MyClass<string> s = new MyClass<string>();
s.Set("Hello");
Console.WriteLine(s.Get()); // Hello
MyClass<int> n = new MyClass<int>();
n.Set(5);
Console.WriteLine(n.Get()); // 5
MyClass<string> 소스 코드public class MyClass<T>
{
T val;
void Set(T a) { val = a; }
T Get() { return val; }
}
public class MyClass<string>
{
string val;
void Set(string a) { val = a; }
string Get() { return val; }
}
val 타입 : stringstring 타입의 값 a를 val에 지정string 타입의 값 val을 리턴💡 제네릭 타입을 선언할 때, 인자 타입을 지정할 수 있다.
- 값 형식인지 참조 형식인지 or 어떤 특정 부모 클래스로부터 파생된 타입인지 or 어떤 인터페이스를 구현한 타입인지
where T: 제약 조건
Tclass MyClass<T> where T : structTclass MyClass<T> where T : classclass MyClass<T> where T : new()class MyClass<T> where T : MyBaseClassclass MyClass<T> where T : IComparableclass MyClass<T> where T : struct where V : classclass MyClass<T> where T : Person, I Comparable<T>, new()List<Dog> odgs = new List<Dog>();
List<Animal> animals = dogs; // 에러
out 키워드)IEnumerable<Dog> dogs = new List<Dog>();
IEnumerable<Animal> animals = dogs;
in 키워드)IComparer<Animal> animalComparer = new AnimalComparer();
IComparer<Dog> dogComparer = animalComparer;
IEnumerable<out T>IEnumerator<out T>IQueryable<out T>IGrouping<out TKey, out TValue>IComparer<in T>IComparable<in T>IComparer<in T>List<T> 메서드리스트 객체의 각 원소를 T 형으로 변환하여 리스트로 반환할 수 있다.
public bool Exists(Predicate<T> match)
리스트에 있는 모든 원소 중 match 조건을 만족하는 원소가 있는지 여부를 반환한다.
Find() : List에서 조건을 만족하는 첫번째 원소를 반환한다.
FindAll() : List에서 조건을 만족하는 모든 원소를 리스트로 반환한다.
FindIndex() : List에서 조건을 만족하는 첫번째 인덱스를 반환한다.
FindLastIndex() : List에서 조건을 만족하는 마지막 원소의 인덱스를 반환한다.
ForEach()
TrueForAll() : 리스트의 모든 원소가 조건을 만족하는지 여부를 반환한다.
Remove()
HashSet<T>중복 요소를 포함하지 않는 고유한 요소의 정렬되지 않은 컬렉션
yeild 키워드컬렉션 데이터를 하나씩 리턴할 때 사용한다.
yield 키워드 예제yield return 은 컬렉션 데이터를 하나씩 리턴할 때 사용한다.yield break 는 리턴을 중지하고 iteration 루프를 빠져나올 때 사용한다.public class yieldTest
{
static IEnumerable<int> GetNumber()
{
yield return 10; // 첫번째 루프에서 리턴되는 값
yield return 20; // 두번째 루프에서 리턴되는 값
yield return 30; // 세번째 루프에서 리턴되는 값
}
}
public static void Main(string [] args)
{
foreach(int num in GetNumber())
{
Console.WriteLine(num);
}
}
출력 결과 : 10 20 30
개인적으로 만든 클래스에 대해서 컬렉션에 추가하고, Sort를 이용해 정렬할 때 인터페이스를 구현해야 한다.
이때 구현해야할 메서드는 CompareTo 메서드이다.
음수0양수public int CompareTo(A a)
{
if (this.str.CompareTo(a.str) == 0)
{
if (this.num > a.num)
return 1;
else if (this.num < a.num)
return -1;
else
return 0;
}
else
{
return this.str.CompareTo(a.str);
}
}
truefalse