Generic(제너릭)
사전적 정의 : 일반적인, 포괄적인, 통칭의, 범용
screwdriver set as a generic tool
※ (드라이버 꼭지)를 바꿈으로서 다양하게 사용할 수 있다.
※ Professional .NET 2.0 Generics이라는 책이 존재할 정도로 방대한 분야.
장점
Type checking, boxing, casting 등의 작업 불필요 => 성능 향상
사용 용도
Custom List, Collection 등을 쉽게 구현
object List 정의
public class List
{
private object[] elements;
private int count;
public void Add(object element){ ... }
public object this[int index]{ get... set... }
public int Count { get... }
}
object List 사용 예시
List intList = new List();
intList.Add(1); // boxing 실행됨.
intList.Add(2);
intList.Add("Three"); // 이후에 Runtime시 잠재적 에러 가능성. (배열 형태기 때문에)
int i = (int)intList[0]; // 형 변환 필요.
요소의 타입이 object인 List 클래스
Type Casting 필요
에러 발생시 run-time 에러
값 형식이 저장되면
boxing/unboxing 호출됨 -> 성능 저하
※ 범용적으로 사용될 수 있으나 최선의 방법은 아니다.
C# 1.0 해결책
Strong Typed List 생성
- intList, stringList, myClassList
문제점
각각의 타입마다 코드생성 -> 관리의 어려움
각각의 코드는 상당히 유사함
C# 2.0 해결책
코드상 generic
정의(define) : 특정 logic을 구현하는 것. 함수 정의, 클래스 정의 등.
코드의 사용(reference) : 구현된 로직을 사용.
List, Collection, Queue, Stack 등의 모든 자료 구조에 적용가능.
Generic type 정의
public class List<T>
{
private T[] elements;
private int count
public void Add(T element){ ... }
public T this[int index] { ... }
public int Count{ ... }
}
Generic type 사용
List<int> intList = new List<int>();
intList.Add(1); // boxing 발생하지 않음.
intList.Add(2);
intList.Add("Three"); // 컴파일 에러 발생
int i = intList[0]; // 형변환 필요없음.
※ int가 type parameter에 대입되는 효과를 가진다.
T = type parameter
T는 타입 자리에 들어간다.
클래스 부분에 <T>라고 써 준다.
※ Generic으로 만들어진 코드는 사용하면서(reference) 완성된다.
예시)
void swap<T>(ref T a, ref T b)
{
T c;
c = a;
a = b;
b = c;
}
type parameter에 대해 constraint 적용이 가능하다.
예시)
void swap<T>(ref T a, ref T b) where T:struct
object에 대해 적용 안되며 일반 타입에 대해서만 적용되는 함수를 만든다.
정의
코드의 특정부분을 구체적으로 정의(define)하지 않고 사용(reference)하는 것
적용 코드 부분 : class, interfaces, method
특정부분(정의하지 않는 부분)
<T> : Type Parameter
코드 정의 : type은 <T>와 같이 일반적(Generic)으로 정의
코드 사용 : 명시적 <T>를 정의
Framework에 정의되어 있는 Generic 코드
Collection classes
List<T>, Dictionary<TKey, TValue>, SortedDictionary<TKey, TValue>, Stack<T>, Queue<T>, LinkedList<T>
Collection interfaces
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
장점
타입 안정적(=strong typed) : No more object~
성능향상
Object안에 Integer를 넣었을 때 Generic이 3배 빠름.
Object안에 String를 넣었을 때 Generic이 20% 빠름.
효율적인 코드관리
코드 재사용
polymorphism : interface, class override, delegate, generic
IDE Tools 지원
실제 코드의 완성은 사용(refererence)하면서 됨.
CLR 기능
runtime시 동작
VB.NET, C++.NET등의 언어에서도 지원
C++의 탬플릿과 개념은 유사하나 기능상으로 많이 다름.
자바의 Generic은 Boxing/Unboxing이 항상 수행된다는 점에서 .NET버젼이 더 우수하다.
'C#' 카테고리의 다른 글
Iterator (0) | 2009.09.07 |
---|---|
Nullable Type (0) | 2009.09.07 |
Partial Class (0) | 2009.08.29 |
C# 3장 간단 정리 (0) | 2009.07.30 |
C# 2장 간단 정리 (0) | 2009.07.30 |