본문 바로가기

C#, C++

C# 제네릭 <generic>

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가 나오게 될 것이다.