순서

I. Generic
II. 예제

 


I. Generic

 

C#의 Generic Programming은 타입의 일반화라고 생각하면 된다.
(C++의 Template과는 좀 차이가 있다.) 아래 링크 참고

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/generics/differences-between-cpp-templates-and-csharp-generics

Generic 특징
1. 컴파일 시 형식검사X 런타임시 확인O
2. Method Overloading의 불편함을 해결하기 위해 등장
3. Linked List, HashTable, Stack 등에 사용함
    List<T> Queue<T> Stack<T> Dictionary<K, V>
4. where T : struct , class, new(), ICmparable 등 어디서 파생되었는지 설정 가능

 


II. 예제

 

1. Generic Class를 정의하여 사용하는 예제

 

using System

namespace GenericApp {
// Generic Class 정의
  class CSum<T> {
    public T sum(T i, T j) {
      // dynamic으로 casting하여 동적으로 형 변환 필수
      return (dynamic)i + (dynamic)j;
    }
  }
  
  class CMain {
    public static void Main() {
    // 정의된 클래스 생성방법
      CSum<int> Sum1 = new CSum<int>() {
        Console.WriteLine($"{Sum1.sum(1,3)}");
      }
    }
  }
}

 

2. Generic Method를 사용하는 예제(Array)

 

using System

namespace GenericApp {
  class CArray {
    public T[] getArray<T>(int size, T val) {
      T[] array = new T[size];
      for (int i=0; i<size; i++) {
        array[i] = val;
      }
      return array;
    }
  }
  
  class CMain {
    public static void Main() {
      CArray<string> arr1 = new CArray();
      Console.WriteLint($"{arr1.getArray<string>(3,"hello").Length}");
    }
  }
}

 

3. Generic Class를 사용하는 예제(Stack)

 

주로 어떤 형식이 들어올지 모르는 Stack, Queue등에서 자주 사용한다.

using System;

namespace GenericApp4 {
  class CStack<T> {
  
    private T[] _stack = new T[10];
    int curidx = 0;
    
    public void push (T data) {
      _stack[curidx] = data;
      curidx++;
    }
    
    public T pop() {
      if (curidx == 0) {
        return default(T); // generic에서 null반환
      } else {
        curidx--;
        return _stack[curidx] = data;
      }
    }
    // Main은 똑같이 구현..
  }
}

+ Recent posts