c# 클래스를 정의할 때, 들어가는 인자값이나 리턴값 등 클래스 내의 모든 데이터 타입을 지정한다.
하지만, 어떤 경우에는 거의 모든 내용이 같은데, 일부 데이터타입만 다른 경우가 존재한다.
예를들어,
public class MyStack
{
int[] _elements;
int pos = 0;
public MyStack()
{
_elements = new int[100];
}
public void Push(int element)
{
_elements[++pos] = element;
}
public int Pop()
{
return _elements[pos--];
}
}
class Program
{
static void Main(string[] args)
{
MyStack stack1 = new MyStack();
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);
Console.WriteLine(stack1.Pop().ToString());
Console.WriteLine(stack1.Pop().ToString());
Console.WriteLine(stack1.Pop().ToString());
}
}
이 MyStack 클래스는 int인자를 Push로 받아서 내부적으로 선언된 int배열인 _elemets에 넣고
pop을 통해 int형으로 반환하는 int형 스택이다.
하지만 만약에,
우리가 int스택이 아니라 string스택을 만든다면? double형 스택을 만든다면?
그 때마다 이런형식의 클래스를 타입만 바꿔서 계속 재선언 해 주는 일은 매우 비효율적인 일이다.
클래스 선언을 한 번만 하고 stack1을 stack.push(1)을 하던가 stack.push("1")을 하던가 stack.push(1.0)을 하는
방법은 없을까? 라는 생각에서 생겨난게 바로 generic이다.
제네릭의 사용법은 코드를 보면 아주 쉽게 이해 할 수 있을것이다.
위의 코드에 제네릭을 적용해서 한 번의 클래스 선언으로 어떤 타입의 스택이던 구현할 수 있게끔 해보겠다.
public class MyStack<T>
{
T[] _elements;
int pos = 0;
public MyStack()
{
_elements = new T[100];
}
public void Push(T element)
{
_elements[++pos] = element;
}
public T Pop()
{
return _elements[pos--];
}
}
class Program
{
static void Main(string[] args)
{
MyStack<int> stack1 = new MyStack<int>();
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);
Console.WriteLine(stack1.Pop().ToString());
Console.WriteLine(stack1.Pop().ToString());
Console.WriteLine(stack1.Pop().ToString());
MyStack<string> stack2 = new MyStack<string>();
stack2.Push("4");
stack2.Push("5");
stack2.Push("6");
Console.WriteLine(stack2.Pop());
Console.WriteLine(stack2.Pop());
Console.WriteLine(stack2.Pop());
}
}
출력 결과는 3,2,1,6,5,4가 나오게 될 것이다.
'C#, C++' 카테고리의 다른 글
c#을 이용한 TCP/IP 서버-클라이언트 소켓(Socket)통신 (1) | 2022.02.15 |
---|---|
WPF ItemsControl을 이용해서 UIelement를 반복해서 표현하는 방법(xaml에서 for문, foreach문을 대신해서 사용할 수 있는 방법) (0) | 2021.11.08 |
C# 바인딩 (onetime, oneway, twoway, onewaytosource) (0) | 2021.08.12 |