제네릭(Generics) : 특정 형식으로 고정하지 않아 다른 형식으로 재사용할 수 있도록 만드는 자리표(placeholder).
제네릭을 사용하는 이유
- 매개변수 형식만 다르고 기능이 같은 클래스를 따로 짤 필요가 없음. (생산성 향상)
- 상위 형식의 매개변수로 만들 경우 캐스팅과 박싱이 많이 일어나고 불안정해지는 데 이를 해결할 수 있음.
- 하나의 코드로 모든 형식에 대해 작동하도록 일반화하고 특정 원소 형식에 맞게 특수화 가능.
사용법
- 자리표로 사용할 형식을 T로 시작한 이름으로 놓는다. (예: T, TValue, TKey, ...) 이를 형식 매개변수라고 한다.
- <,>사이에 형식 매개변수를 넣고 클래스(형식), 메서드의 이름 뒤에 붙여 코드를 작성하면 된다.
*주의점: 생성자는 클래스의 형식 매개변수를 사용해야 하고 <T>를 도입하면 안된다.
*형식과 메서드에만 제네릭을 쓸 수 있다. 인덱스에 쓰는 경우
*제네릭 내부의 멤버들은 형식 매개변수를 자유롭게 쓸 수 있다.
어떤 형식이든 상관없이 사용할 수 있는 (초보적인) 큐를 구현한 예시이다.
using System;
public class Queue<T>
{
int head;
int tail;
T[] data = new T[100];
public void Put(T obj) => data[tail++] = obj;
public T Get() => head < tail ? data[head++] : data[head];
}
class _
{
static void Main()
{
var stringQueue = new Queue<string>();
stringQueue.Put("queue1");
stringQueue.Put("queue2");
Console.WriteLine(stringQueue.Get()); //queue1
Console.WriteLine(stringQueue.Get()); //queue2
}
}
여기서 Queue<string>은 암묵적으로 컴파일러가 형식 T에 string을 넣어 즉석에서 만들어낸다.
Queue<T>와 같은 것을 열린 형식(Open Type), Queue<string>와 같은 것을 닫힌 형식(Closed type)이라 한다.
제네릭 메서드: 제네릭을 사용한 메서드
아래는 제네릭을 활용한 두 변수를 바꾸는 함수의 예시이다.
static void Swap<T> (ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
이를 사용하면
int x = 1;
int y = 7;
Swap (ref x, ref y) //추론 가능하므로 <>으로 형식을 명시하지 않아도 된다.
//추론에 실패할 가능성이 있다면 다음처럼 확실하게 써야한다.
//Swap<int> (ref x, ref y)
'C#' 카테고리의 다른 글
C# 스레드 - 1 (0) | 2022.06.19 |
---|---|
[Notion] Rx.Net in Action 요약 정리 (0) | 2022.03.10 |
C# 이벤트(Events) 접근자와 수정자 (0) | 2020.11.27 |
C# EventHandler 표준 이벤트 구현 (0) | 2020.11.27 |
C# 이벤트(Events) (0) | 2020.11.26 |