[C#] 8.2.3 IList인터페이스

IList 인터페이스는 배열과 ArrayList의 기반 인터페이스입니다. IList 인터페이스에는 인덱서로 요소를 참조할 수 있는 멤버들을 약속하고 있습니다. 그리고 IList는 ICollection 인터페이스 기반의 형식이므로 앞에서 살펴본 ICollection에 약속한 멤버들에 대한 약속을 포함하게 됩니다. 여기에서는 새롭게 추가된 약속들에 대해서만 다룰게요.

ICollection 인터페이스에서는 요소를 추가할 때 사용하기 위해 Add 메서드와 Insert 메서드를 제공하고 있습니다. Add 메서드는 차례대로 보관할 때 사용하고 Insert 메서드는 원하는 인덱스 위치에 보관할 때 사용합니다.

int Add(object value); //요소를 추가하는 메서드
void Insert(int index, object value); //요소를 특정 인덱스 위치에 보관하는 메서드

만약, Add메서드로 1을 보관하고 Insert 메서드를 이용하여 인덱스 0에 2를 보관하면 보관된 순서는 2, 1이 됩니다. 다시 Add 메서드를 이용하여 3을 보관하면 2, 1, 3 순으로 보관되겠죠.

▶ Add메서드와 Insert 메서드를 이용하여 요소 보관

static void Main(string[] args)
{
    ArrayList ar = new ArrayList();
    ar.Add(1);
    ar.Insert(0, 2);
    ar.Add(3);
    foreach (int a in ar)
    {
        Console.Write("{0} ", a);
    }
}

▶ 실행 결과

2 1 3

보관한 요소를 제거할 때는 Remove 메서드와 RemoveAt 메서드, Clear 메서드를 사용합니다. Remove 메서드는 제거할 요소를 인자로 전달하면 보관된 해당 요소를 제거해 줍니다. RemoveAt 메서드는 특정 인덱스 위치에 보관된 요소를 제거하며 Clear 메서드는 보관된 모든 요소를 제거합니다.

void Remove(object value); //요소를 제거하는 메서드
void RemoveAt(int index); //특정 인덱스에 보관된 요소를 제거하는 메서드
void Clear();//보관된 전체 요소를 제거하는 메서드

▶ Remove, RemoveAt, Clear 메서드를 이용하여 보관된 요소 제거

static void Main(string[] args)
{
    ArrayList ar = new ArrayList();
    for (int i = 1; i <= 4; i++)
    {
        ar.Add(i);
    }

    ar.Remove(3); //보관된 요소 중에 3이 있으면 제거 (1, 2, 4)
    ar.RemoveAt(0); //인덱스 0에 있는 요소 제거(2, 4)
    foreach (int element in ar)
    {
        Console.WriteLine(element);
    }
    ar.Clear(); //보관된 모든 요소 제거
    Console.WriteLine("보관된 요소 개수:{0}", ar.Count);
}

▶ 실행 결과

2
4
보관된 요소 개수:0

그리고 Contains 메서드를 이용하여 특정 요소가 보관되어 있는지 확인할 수 있으며 인덱서를 이용하여 보관한 요소를 변경하거나 참조할 수 있습니다. 이 외에도 컬렉션의 크기가 고정된 사이즈인지 확인하는 IsFixedSize 속성과 읽기만 가능한지에 대해 가져오기를 할 수 있는 IsReadOnly속성을 제공하고 있습니다.

bool Contains(object value); //요소가 보관되었는지 확인하는 메서드
object this[int index]{    get;    set;    }  //인덱서
bool IsFixedSize {    get;    }//고정 사이즈 속성 - 가져오기
bool IsReadOnly {    get;    }//읽기만 가능한지에 대한 속성 - 가져오기

▶ 보관한 요소 확인, 참조 및 변경

static void Main(string[] args)
{
    ArrayList ar = new ArrayList();
    ar.Add(3); //3
    ar.Add(2); //3, 2
    ar[0] = 4; //인덱스 0에 보관된 요소를 4로 변경 (4, 2)
    for (int i = 1; i <= 5; i++)
    {
        if (ar.Contains(i)) //i가 보관되어 있을 때
        {
            int index = ar.IndexOf(i); //보관된 인덱스를 얻어옴
            Console.WriteLine("인덱스 {0}에 {1}보관되어 있음, index, i);
        }
    }
    for (int i = 0; i < ar.Count; i++)
    {
        Console.WriteLine("ar[{0}]: {1}", i, ar[i]); //인덱스 i에 있는 요소 출력
    }
}

IList 인터페이스를 기반으로 정의한 형식은 모두 예제 코드와 같은 방식으로 사용할 수 있습니다.

▶ IList에서 약속한 멤버들

interface IList:ICollection
{
    int Add(object value); //요소를 추가하는 메서드
    void Clear();//보관된 전체 요소를 제거하는 메서드
    bool Contains(object value); //요소가 보관되었는지 확인하는 메서드
    int IndexOf(object value); //요소가 보관된 인덱스를 계산하는 메서드
    void Insert(int index, object value); //요소를 특정 인덱스 위치에 보관하는 메서드
    bool IsFixedSize{    get;    }//고정 사이즈 속성 - 가져오기
    bool IsReadOnly{    get;    }//읽기만 가능한지에 대한 속성 - 가져오기
    void Remove(object value); //요소를 제거하는 메서드
    void RemoveAt(int index); //특정 인덱스에 보관된 요소를 제거하는 메서드
    object this[int index] {    get;    set;    } //인덱서

    #region ICollection 인터페이스에서 약속한 멤버
    void CopyTo(Array array, int index);
    int Count{    get;    }
    bool IsSynchronized{    get;    }
    object SyncRoot{    get;    }
    #endregion
    #region IEnumerable 인터페이스에서 약속한 멤버
    IEnumerator GetEnumerator();
    #endregion
}