[이것이 C#이다] 11장 일반화 프로그래밍
일반화란 : 특수한 개념으로부터 공통된 개념을 찾아 묶는 작업
일반화 프로그래밍의 일반화 대상 : 데이터 형식
데이터 형식을 일반화한 메소드
⭐️ 일반화 메소드 기본 형식
한정자 반환_형식 메소드_이름<형식_매개변수> (매개변수_목록)
{
// ...
}
T
🔗 일반화 메소드 사용 예
void CopyArray<T> (T[] source, T[] target)
{
for(int i=0; i<source.length; i++)
target[i] = source[i];
}
CopyArray<int>(source,target);
데이터 형식을 일반화한 클래스
⭐️ 일반화 메소드 기본 형식
class 클래스_이름 <형식_매개변수>
{
// ...
}
🔗 일반화 메소드 사용 예
class Array_Generic<T>
{
private T[] array;
// ...
public T GetElement(int index) {return array[index];}
}
Array_Generic<int> intArr = new Array_Generic<int>();
Array_Generic<double> dblArr = new Array_Generic<double>();
특정 조건을 갖춘 형식에만 대응하는 형식 매개변수가 필요할 때 형식 매개변수의 조건에 제약을 줄 수 있음
⭐️ 기본 형식
where 형식 매개변수 : 제약_조건
ckas MyList<T> where T : MyClass
{
// ...
}
🔗 where T : U
사용 예
class BaseArray<U> where U : Base
{
public U[] Array{get;set;}
public BaseArray(int size)
{
Array = new U[size];
}
public void CopyArray<T>(T[] Source) where T : U
{
Source.CopyTo(Array,0);
}
}
-> CopyArray<T>()
는 소속 클래스인 BaseArray<U>
의 형식 매개변수 U
로부터 T
가 상속받아야 함을 강제함
U
, V
: 여러 형식 매개 변수object 형식 기반의 컬렉션의 문제점 :
일반화 컬렉션은 이러한 문제점들을 해결해 줌
List<T>
비일반화 클래스인 ArrayList
와 같은 기능과 사용법
🔗 사용 예
List<int> list = new List<int>();
list.add(1);
list.RemoveAt(1);
list.Insert(1,1);
Queue<T>
비일반화 클래스인 Queue
와 같은 기능과 사용법
🔗 사용 예
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
int num = queue.Dequeue();
Stack<T>
비일반화 클래스인 Stack
와 같은 기능과 사용법
🔗 사용 예
Stack<int> stack = new Stack<int>();
stack.Push(1);
int num = stack.pop();
Dictionary<TKey, TValue>
비일반화 클래스인 HashTable
와 같은 기능과 사용법
🔗 사용 예
Dictionary<string, string> dic = new Dictionary<string, string>();
dic["하나"] = "one";
string temp = dic["하나"]
기본적인 foreach 사용 가능 클래스 : IEnumerable
인터페이스 상속
일반화 클래스는
IEnumerable
인터페이스 외에IEnumerable<T>
인터페이스도 상속하여 구현해주어야 성능 저하가 없음
IEnumerator<T>
메소드와 프로퍼티🔗 사용 예
class MyList<T> : IEnumerable<T>, IEnumerator<T>
{
private T[] array;
int position = -1;
...
public IEnumerator<T> GetEnumerator() {return this;}
IEnumerator IEnumerable.GetEnumerator() {return this;}
public T Current { get {return array[position];} }
object IEnumerator.Current { get {return array[position];} }
public bool MoveNext(){ ... }
public void Reset(){ ... }
public void Dispose(){ ... }
}