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
반응형