본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 34. 제네릭

1. 제네릭 메소드

저어어어말 예전에

Swap함수를 짠적이 있다.



class Program
{

static void MySwap( ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 10;
int b = 20;

MySwap(ref a, ref b);

Console.WriteLine("{0},{1}",a,b);
}
}

요런식으로 짯다.

근데 해당 함수는 int만 가능하다.

여기에 double이나 기타등등 까지 다 스왑하고 싶다면..


static void MySwap( ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
}

static void MySwap(ref double a, ref double b)
{
double temp = a;
a = b;
b = temp;
}

뭐 이런식으로 함수 오버로딩하여 스왑함수를 만들것이다.


그런데 이런 스왑 함수는 자료형만 다르고 완전하게 동일한 함수이다.

그럼에도 불구하고 다른 자료형에대한 swap이 필요하면 또 만들어줘야한다.


이럴때 사용되는것이 제네릭이다.


class Program
{
static void MySwap<T>(ref T t1, ref T t2)
{
T temp = t1;
t1 = t2;
t2 = temp;
}

static void Main(string[] args)
{
int a = 10;
int b = 20;

MySwap(ref a , ref b );

Console.WriteLine("{0},{1}",a,b);
}
}
}

<제네릭타입> 을 통하여 써주면 이제부터 그 제네릭타입을 일종의 어떤 자료형으로 보고 사용가능하며

그 자료형은 컴파일타임에 알맞게 코드가 생성된다.


여기서는 <T> 를 이용했으면 int형을 사용하여 T가 int로 전부 바뀌어진 MySwap코드가 컴파일시간에 만들어진것이다.


MySwap(ref a , ref b );
MySwap<int>(ref a, ref b);

이런식으로 <int>형이라고 명시적으로 표현해주어도 된다.



이렇게 함수에적용하는게 제네릭 메소드라면

이걸 클래스에 적용하면 제네릭 클래스이다.


2.제네릭 클래스

class GenericClass<T>
{
T t;

public GenericClass(T t)
{
this.t = t;
}

public T GetT()
{
return t;
}
}
class Program
{

static void Main(string[] args)
{
GenericClass<int> a = new GenericClass<int>(10);
GenericClass<string> b = new GenericClass<string>("10");
}
}

걍뭐 이런식으로 이용한다 문법은 위와 동일하고..


왜쓰냐고 하면 ... 다음 컬랙션에서 배운다.


ps. C++ 의 템플릿과 유사한 개념이다. 다만 C++의 템플릿에 비해 훨씬 안전한데 C++ 개발자 입장에서 사용하기에는 무지막지하게 짜증난다.. 제한이 많다. 당장 +,-,*,- 를 사용할수없고 뭐 기타등등..

728x90