본문 바로가기

ETC Programmings

[C#] 의 고급 문법 : Generic

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
 자바에서 Generic 이라는 것을 처음 접하면서 C++에 있는 Template 라는 것과 많이 비교되며 배운 기억이 있다. Generic 이라는 것이 Template 랑 유사할 것이지 같은 의미로 사용되지 않는다는 점을 꼭 기억했으면 한다. 실제로 자바 뿐만아니라 C#에서 사용되는 Generic 이라는 문법 역시 C++의 그것과는 많이 다르게 단순하며 그만큼 또 유연하지 못하고 기능도 적은 편이라고 한다.

Generic을 사용하는 것은 코드의 재사용성을 높여서 타입에 대한 안전성을 극대화시키는 장점이 있지만 반면에 코드의 크기가 커지고 가독성이 떨어지는 불리함이 있다. 코드의 크기가 커지는 것에 대해서는 문제삼기보다는 가독성에 대해서 문제 삼을 점이 많다. 가독성이 떨어진다는 것은 그만큼 소스코드를 이해하는데에 드는 비용이 크다는 이야기 이기때문에 되려 생산성에 문제를 야기 시킬 수 있다.

보통 사용하는 사람의 입장에서는 Generic이 별로 문제가 되지는 않지만 반대로 사용하는 사람 입장에서는 다소 이해하기 불편한 부분이 있다.

다음은 Generic을 사용한 ArrayList 이다.

  1. class MyArrayList<T>   
  2.     {   
  3.         private T[] dataSet;   
  4.   
  5.         private int length;   
  6.   
  7.         private int initSize;   
  8.   
  9.         public MyArrayList()   
  10.         {   
  11.             reset();   
  12.         }   
  13.         public MyArrayList(int size)   
  14.         {   
  15.             this.initSize = size;   
  16.             this.dataSet = new T[initSize];   
  17.             this.length = 0;   
  18.         }   
  19.   
  20.         public void add(T entry)    
  21.         {   
  22.             if (!isFull())   
  23.             {   
  24.                 dataSet[length] = entry;   
  25.                 length++;   
  26.             }   
  27.             else{   
  28.                 expandArray();   
  29.                 add(entry);   
  30.             }   
  31.         }  

다른 클래스 들과 달리 독특한 점이라면 Class 이름 뒤에 <> 라는 영역에 T라는 키워드가 붙는 다는 점이다. 소스에 보면 T형으로 선언된 배열이 선언되어있다. 이점을 가장 주목해볼만 한데 사실 T형이라고 불리우게 되는 이유도 이곳에 있다. ArrayList의 add 라는 메소드를 살펴보면 Argument 로 entry 라는 T형의 변수가 선언 되어있다. T라는 것은 다양한 형태의 클래스가 올 수 있으면서 이곳에 어떤 특정 형태의 클래스로 선언이 되면 해당 클래스에만 맞는 인스턴스가 된다.


  1. IList list = new ArrayList();   
  2. list.Add("하이");   
  3. list.Add(300);   
  4.                
  5. IList<String> list2 = new List<String>();   
  6. list2.Add("헬로");   
  7. list2.Add(1234);  
<위의 예제에서는 7번쨰 줄은 컴파일 에러가 나게 된다.>


String 의 형태로 인스턴스를 생성하면 String만을 위한 ArrayList 가 되고, Integer 의 형태로 선언하면 Integer 만을 위한 ArrayList 가 되는 것이다. 기존에 Object 형태를 받는 ArrayList 라면 TypeCasting 에 대한 반복되는 부분이 발생하고 또한 더불어 List 에 Add 를 시킬때도 다양한 타입의 인스턴스를 받을 수 있는 잠재적인 문제가 생긴다. 하지만 Generic의 사용으로 문법적인 제약을 줌으로서 잠재적으로 야기 될 수 있는 문제도 처리하게 된다.

하지만 Generic 을 사용하며 마냥 맹신할 것이 아니라 Generic 이 주는 문제점에 대해서도 분명히 알고 가야 할 것이다. C#의 Generic와 Java Generic이 구조적으로 얼마나 유사한지는 모르겠으나.. 도움이 될까? 해서 한번 올려본다.

Generics in Java Are Evil?