본문 바로가기

C#

C# 제네릭(Generics) 1

제네릭(Generics) : 특정 형식으로 고정하지 않아 다른 형식으로 재사용할 수 있도록 만드는 자리표(placeholder).

제네릭을 사용하는 이유

  1. 매개변수 형식만 다르고 기능이 같은 클래스를 따로 짤 필요가 없음. (생산성 향상)
  2. 상위 형식의 매개변수로 만들 경우 캐스팅과 박싱이 많이 일어나고 불안정해지는 데 이를 해결할 수 있음.
  3. 하나의 코드로 모든 형식에 대해 작동하도록 일반화하고 특정 원소 형식에 맞게 특수화 가능.

사용법

  1. 자리표로 사용할 형식을 T로 시작한 이름으로 놓는다. (예: T, TValue, TKey, ...) 이를 형식 매개변수라고 한다.
  2. <,>사이에 형식 매개변수를 넣고 클래스(형식), 메서드의 이름 뒤에 붙여 코드를 작성하면 된다.

*주의점: 생성자는 클래스의 형식 매개변수를 사용해야 하고 <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