728x90

닷넷2005의 가장 중요하면서 어려운 개념인 Generic에 대해 알아보겠습니다.

오늘 할 내용은 Generic에 대해 심도있는 공부를 위한 기본개념을 익히는 정도로만 진행하겠습니다.

소개.

- 사전적 의미 : 일반적인, 범용적인, 통칭의, 포괄적인
- C# 2.0에서 가장 핵심적인 기능.
- ASP, JAVASCRIPT, VB 프로그래머에겐 생소한 개념.

Generic은 사전적의미에서 보는바와 같이 일반적이고 포괄적인 개념입니다.

c# 2.0버전에서 가장 핵심적인 기술이라 보면 될 것이고 범위도 워낙 방대하여

Generic에 관해 시중에 서적으로 유통되기도 합니다.

기존 ASP, JAVASCRIPT, VB개발자들과 같이 OOP를 잘 다루지 못하는 개발자일 경우

생소하게 다가올 수가 있습니다.


장점.

- Type Checking 불필요.
- boxing 불필요.
- Type Casting 불필요.
- 위 3개의 과정이 없어지므로 성능의 향상을 가져옴.

Generic에 대해 자세한 설명을 위해 기존 1.0버전에서의 코드를 예로 들어 설명해 보겠습니다.

간단한 스택 클래스를 작성해 보겠습니다.

public class Stack {

  object[] m_Items; 
  public void Push(object item)
  {...}
  public object Pop() 
  {...}

}

Stack stack = new Stack();

stack.Push(1); //boxing

stack.Push(2); //boxing

int number = (int)stack.Pop(); //Type Checking, Type Casting


아이템을 담을 수 있는 object 객체배열을 멤버로 가지고 Push에서 아이템을 삽입하고 Pop에서

아이템을 제거합니다.


위와 같은 코드는 잘 실행되긴 하지만 다음과 같은 문제점들이 있습니다.

stack.Push(1); 이 구문에서 object 타입을 받지만 value타입인 int형을 받았습니다.

이때 내부적으로 value타입인 int를 boxing하여 레퍼런스타입으로 변환하여 삽입하게 됩니다.

또한 이를 위해 사전에 CLR환경에서 type checking 작업을 수행하고 type casting을 하게됩니다.

위와 같은 과정으로 인해 성능의 저하를 가져오게 됩니다.

또한 int number = (int)stack.Pop(); 에서와 같이 object 타입으로 받기 때문에

int 타입이 아닌 string 타입의 값이 들어가 있을 경우 형변환시 실행시간 런타임 오류가 발생하게

되는 문제가 있습니다.


현재 1.0버전에서 위와같은 문제의 해결책으로 strong typed List를 생성합니다.

이것은 m_Items 멤버를 int형만 담을 수 있는 int[] m_IntItems, string[] m_StringItems와 같이

타입에 따라 멤버를 선언하고 구현하여 리스트를 생성하게 됩니다.

이렇게 할 경우 object 타입에서의 Boxing, Type Checking, Type Casting의 문제는 해결할 수 있지만

각 타입마다 코드를 생성해야 하므로 관리에 어려움이 있고 각 코드들은 상당히 유사하므로 관리및

유지보수의 문제가 생길 수 있습니다.


위와 같은 문제들이 C# 2.0에 Generic이라는 기술이 생겨나게 된 배경입니다.

List, Collection, Queue, Stack 등의 모든 자료구조에 적용가능합니다.

Generic 관점에서 본 코드구분.

* 정의(define)
 - 특정 로직을 구현.
 - 함수정의, 클래스정의, 인터페이스 정의.
* 사용(reference)
 - 구현된 로직을 사용.
 - 함수호출, 클래스사용.

Generic Type 정의(define)

public class List<T>

{

T[] elements;

int count;

public void Add(T element)

{ ... }

public T this[int index]

{ ... }

}


Generic Type 사용(reference)

List<int> list = new List<int>();

list.Add(1); // boxing X

list.Add(2); // boxing X

list.Add("3"); // 컴파일 에러.

int i = list[0];// 형변환 X


public static void Swap<T>(ref T t1, ref T t2) where T:struct { ... }

위와 같이 제약조건(contraint)을 줄 수도 있다.

<T>에서의 T는 Type Parameter라 불리고 말 그대로 <T>는 파라미터이므로

변수명을 바꿔줄 수도 있고 <T, U, V>처럼 여러개의 타입파라미터를 지정할 수도 있다.


  • 정리

정의 : 코드(class, method, interface등)의 특정부분(Type)을 구체적으로 정의(define)하지 않고 사용(reference)하는 것.

Framework 2.0에 정의되어 있는 Generic코드.

- Collection Classes
 - List<T>
 - Dictionary<TKey,TValue>
 - SortedDictionary<TKey,TValue>
 - Stack<T>
 - Queue<T>
 - LinkedList<T>

- Collection Intefaces
 - IList<T>
 - IDictionary<TKey,TValue>
 - ICollection<T>
 - IEnumerable<T>
 - IEnumerator<T>
 - IComparable<T>
 - IComparer<T>

- Collection base Classes
 - Collection<T>
 - KeyedCollection<T>
 - ReadOnlyCollection<T>

- Utility Classes
 - Nullable<T>
 - Comparer<T>

- Reflection

장점.

1. 타입안정적.

2. 성능의 향상. 100만개의 배열로 테스트. - integer : Generic이 3배 빠름. - string : Generic이 20% 빠름.

3. 효율적인 코드관리.

4. 코드의 재사용.

5. IDE Tools 지원.

6. 실제 코드의 완성은 사용(reference)하면서 완성됨.

7. CLR 기능 - runtime시 동작하므로 개발툴과의 통합(integration)이 잘된다. - 즉, VB.NET, C++에서도 Generic을 지원.

8. C++의 템플릿과 유사하나 기능상으로 많이 다르다. - 템플릿은 컴파일시 동작하고 Generic은 실행시간에 동작한다. - 런타임시 동작하므로 VB.NET, C++과의 통합이 잘된다.

9. 자바에도 Generic이 있으나 boxing/unboxing이 항상 일어나므로 .NET의 성능이 우수하다.


지금까지 배운내용은 Generic의 시작에 불과합니다.

객체지향에 대한 개념이 있다면 그다지 어렵지 않은 내용이지만 이 Generic을 사용하여

복잡한 솔루션에서 클래스, 메소드, 인터페이스, 델리게이트등을 적절히 사용하면

많은 성능의 효과를 가져온다고 합니다.


다음은 MSDN에서 발췌한 Generic의 장점입니다.

C# generics는 새로운 주요 개발 방법으로서 적절하고 읽기 쉬운 구문을 사용하여 성능, 형식 안전성 및 품질을 향상시키고, 반복적인 프로그래밍 작업

을 줄이고, 전체 프로그래밍 모델을 단순화합니다. C# generics는 C++ 템플릿을 기반으로 하고 있지만 C#는 코드 비대화를 없애고 컴파일 시 안전성 및

지원을 제공함으로써 generics의 수준을 한 차원 높였습니다. C#는 2단계 컴파일, 메타데이터, 제약 조건 및 generic 메서드와 같은 혁신적인 개념을

활용합니다. C#의 향후 버전이 generics를 지속적으로 발전시켜 새로운 기능을 추가하고 generics를 데이터 액세스 또는 지역화 등 .NET Framework의

다른 영역까지 확장할 것은 분명합니다.

[출처] Generic C#2.0 |작성자 허둥사마

728x90

'WEB' 카테고리의 다른 글

브라우저 캐시 자동으로 지우기  (0) 2012.07.29
BOXING & UNBOXING  (0) 2012.07.29
XML이란 - 2  (0) 2012.07.29
XML이란  (0) 2012.07.29
서버&클라이언트 post&get 방식  (0) 2012.07.29

+ Recent posts