[C#] 일반화 프로그래밍 (Generic Programming)

Yijun Jeon·2023년 9월 25일
0

C#

목록 보기
4/7
post-thumbnail

[이것이 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 형식 기반의 컬렉션의 문제점 :

  • 컬렉션 요소에 접근할 때마다 형식 변환이 일어나므로 성능 문제
  • 잘못된 형식의 객체를 담게 될 위험 O

일반화 컬렉션은 이러한 문제점들을 해결해 줌

List<T>

비일반화 클래스인 ArrayList와 같은 기능과 사용법

  • But 형식 매개변수에 입력한 형식만 입력 허용

🔗 사용 예

List<int> list = new List<int>();

list.add(1);
list.RemoveAt(1);
list.Insert(1,1);

Queue<T>

비일반화 클래스인 Queue와 같은 기능과 사용법

  • But 형식 매개변수에 입력한 형식만 입력 허용

🔗 사용 예

Queue<int> queue = new Queue<int>();

queue.Enqueue(1);
int num = queue.Dequeue();

Stack<T>

비일반화 클래스인 Stack와 같은 기능과 사용법

  • But 형식 매개변수에 입력한 형식만 입력 허용

🔗 사용 예

Stack<int> stack = new Stack<int>();

stack.Push(1);
int num = stack.pop();

Dictionary<TKey, TValue>

비일반화 클래스인 HashTable와 같은 기능과 사용법

  • But 형식 매개변수에 입력한 형식만 입력 허용

🔗 사용 예

Dictionary<string, string> dic = new Dictionary<string, string>();

dic["하나"] = "one";
string temp = dic["하나"]

일반화 클래스에서 foreach

기본적인 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(){ ... }
}

0개의 댓글