컴퓨터 공부/C#

Generic

려리군 2009. 8. 20. 20:52

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#' 카테고리의 다른 글

Iterators  (0) 2009.08.24
Nullable Type  (0) 2009.08.24
Partial classes  (0) 2009.08.18
C# 3장 간단 정리  (0) 2009.07.13
C# 2장 간단 정리  (0) 2009.07.11