C# 복습하기 10) 일반화 프로그래밍

일반화 메서드

 - 데이터 형식을 일반화한 메서드

void CopyArray<T>( T[] source, T[] target )
{
    for( int i = 0; i < source.Length; ++ )
        target[i] = source[i];
}

 

일반화 클래스

 - 데이터 형식을 일반화한 클래스

class Array_Generic<T>
{
    private T[] array;
    //...
    public T GetElement( int index ) => array[index];
}

 

형식 매개변수 제약시키기

 - where 절을 통해 형식 매개변수를 제한할 수 있다.

class MyList<T> where T : MyClass // T는 MyClass를 상속하여야한다.
{
    //
}
제약 설명
where T : struct T는 값 형식이어야 함.
where T : class T는 참조 형식이어야 함.
where T : new() T는 반드시 매개 변수가없는 생성자가 있어야 함.
where T : 기반_클래스_이름 T는 명시한 기반 클래스의 파생 클래스여야 함.
where T : 인터페이스_이름 T는 명시한 인터페이스를 반드시 구현해야함. (다중 가능)
where T : U 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);
    }
}

 

일반화 컬렉션

 - List <T>, Queue <T>, Stack <T>, Dictionary <TKey, TValue>는 각각 ArrayList, Queue, Stack, Hashtable의 일반화 버전.

 

Foreach를 사용할 수 있는 일반화 클래스

 - 기존 IEnumerable과 IEnumerator 인터페이스에 추가로 한 개씩을 더 구현해야 함.

 

IEnumerable <T> 인터페이스

메소드 설명
IEnumerator GetEnumerator() IEnumerator 형식의 객체를 반환.
Ienumerator<T> GetEnumerator() IEnumerator<T> 형식의 객체를 반환.

 

IEnumerator <T> 인터페이스

메소드 또는 프로퍼티 설명
bool MoveNext() 다음 요소로 이동. 컬렉션의 끝을 지난 경우 false를 반환
void Reset() 컬렉션의 첫번째 위치의 1개 전으로 이동.
첫 번째가 0이면 -1로 이동함.
따라서 MoveNext()를 호출해야 첫 번째가 됨.
Object Current{ get; } 컬렉션의 현재 요소를 반환
T Current{ get; } 컬렉션의 현재 요소를 반환

 

 

 

댓글

Designed by JB FACTORY