본문 바로가기
C# 공부

generic

by Dev_Hugh 2021. 8. 25.
728x90
반응형

Study about generic

  • 특수한 개념으로부터 공통된 개념을 찾아 묶는 것
  • 일반화(generic)의 대상은 데이터 형식이다.
  • 내부 논리는 같은데 데이터 형식 때문에 오버로딩을 해야할 경우 오버로딩 없이 모든 형식을 지원하는 프로그램 패러다임을 만들때 유용

Generic method

void CopyArray<T> (T[] source, T[] target)
{
    for(int i = 0; i<source.Length; i++)
    {
        target[i] = source[i];
    }
}
static void Main()
{
    int[] source = {1, 2};
    int[] target = new int[source.Length];
    CopyArray<int>(source,target);
    foreach(int element in target)
    {
        Console.WirteLine(element);
    }
}
  • 데이터 형식을 일반화한 메소드로 데이터 형식이 사용된 부분을 T로 치환
  • 형식 매개변수 <>를 이용해 형식을 매개 변수로 넘겨준다.
  • 호출시에는 원하는 타입을 <>에 넣어준다

Generic class

class Array_Generic<T>
{
    private T[] array;
    public T GetElement(int index)
    {
        return array[index];
    }
}
static void Main()
{
    Array_Generic<int> intArr = new Array_Generic<int>();
    Array_Generic<double> dblArr = new Array_Generic<double>();
}
  • 데이터 형식을 일반화한 클래스로 형식 매개변수를 이용해 일반화 클래스로 개선
  • 호출시 원하는 타입을 <>에 넣어준다

형식 매개변수 <> 제약시키기

where T:struct // T는 값 형식이어야 함
where T:class // T는 참조 형식이어야 함
where T:new() // T는 반드시 매개변수가 없는 생성자가 있어야 함

// T는 명시한 기반 클래스의 파생 클래스여야 함
where T:기반_클래스_이름 

// T는 명시한 인터페이스를 반드시 구현
//인터페이스_이름에는 여러개의 인터페이스 명시 가능
where T:인터페이스_이름

// T는 또 다른 형식 매개변수 U로부터 상속받은 클래스여야 함
where T:U

class MyArray<T> where T : MyClass // 이런식으로 사용
  • 특정 조건을 갖춘 형식에만 대응하는 매개변수로 치환
  • where 형식매개변수 : 제약조건 의 형태

Generic collection

  • 컬렉션은 object 형식에 기반하기 때문에 태생적 성능 문제를 내포하고있다.
  • 일반화 컬렉션으로 해결됨
  • 즉 컴파일시 컬렉션에서 사용할 형식 결정되어 잘못된 형식의 객체를 담게 될 위험을 회피할 수 있다.
  • Syste.Collections.Generic 네임스페이스 찾아보기

foreach 사용가능한 generic class

  • IEnumerable과 IEnumerator 상속 구현은 성능을 저하시킴 일반화 클래스를 foreach에 사용할경우 로 구현
  • IEnumerable 와 IEnumerator의 메소드 및 프로퍼티 찾아보기
728x90
반응형

'C# 공부' 카테고리의 다른 글

dynamic  (0) 2021.08.26
property  (0) 2021.08.25
exception  (0) 2021.08.25
interface  (0) 2021.08.25
tuple  (0) 2021.08.22