본문 바로가기
C#

IEnumerable vs ICollection vs IList 차이점

by Fastlane 2021. 12. 2.
728x90
반응형

IEnumerable 

class를 foreach loop를 사용하여 반복순회할때 사용한다. 

IEnumerable interface는 하나의 메소드만 가지고 있다. 

GetEnumerator() : IEnumerator interface를 반환한다. 

IEnumerator interface는 2개의 메소드와 하나의 속성을 가지고 있다. 

MoveNext() : 다음 요소로 이동한다. 

Reset() : 열거 순서를 처음으로 되돌린다. 

Current : 현재 요소를 반환한다. 

 

IEnumerable을 상속받아 GetEnumerater() 메소드를 구현하면, foreach loop를 사용하는 대신, GetEnumerater()로 IEnumerator를 return 받아 MoveNext(), Current로 대체할 수 있다. 

 

  foreach (var item in list)  
    {  
        Console.WriteLine(item);  
    }
IEnumerator enumerator = list.GetEnumerator();  
  
while (enumerator.MoveNext())  
{  
   Console.WriteLine(enumerator.Current);  
}

IEnumerable interface는 collections으로 read-only 접근만 제공한다. IEnumerable List의 어떠한 요소도 변경할 수 없다. list를 변경하고 싶지 않은 경우를 위한 캡슐화를 제공한다. 

 

ICollection

ICollection Interface는 IEnumerable Interface를 상속받는다. 

public interface ICollection : System.Collections.IEnumerable

IEnumerable Interface는 collection에 몇개의 요소가 있는지 제공하지 않았지만, ICollection Interface는 추가 속성을 제공한다. 

Count

IsSynchronized

SyncRoot

CopyTo(Array, Int32)

GetEnumerator() : IEnumerable에서 상속됨

 

IList

IList Interface는 ICollection, IEnumerable Interface를 모두 상속받는다. 

public interface IList : System.Collections.ICollection

IList Interface는 요소의 추가와 삭제를 허용한다. 또한 index로 item에 접근하는 기능도 제공한다. 앞의 2 Interface보다 강력하다. 

IsFixedSize

IsReadOnly

Indexer

Count : ICollection에서 상속됨

Add(Object)

Clear()

Contains(Object)

Indexof(Object)

Insert(Int32, Object)

Remove(Object)

RemoveAt(Int32)

CopyTo(Array, Int32) : ICollection에서 상속됨

GetEnumerator() : IEnumerable에서 상속됨

IList Interface는 one indexer를 갖고 있오, 어느 위치의 요소로든 접근할 수 있고, 요소를 추가하고, 어느 위치의 요소든 삭제가 가능하다. 

 

List<T>

Namespace : System.Collections.Generic

public class List<T> : System.Collections.Generic.ICollection<T>, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.IList

 

Interface Scenario
IEnumerable, IEnumerable<T> collection의 요소들을 순회하고 싶을 때, read-only 접근만 필요할때 
foreach만 필요할 때
ICollection, ICollection<T> collection을 변형하고, size를 알고 싶을때 
IList, IList<T> collection의 요소들의 순서와 위치를 관리하고, collection을 변형하고 싶을 때 

List<T>

앞의 3개는 Interface이고 List<T>는 concrete 클래스이다. 

IList<Employee> EmpList = new List<Employee>();

List<Employee> EmpList = new List<Employee>();

var EmpList = new List<Employee>();

 

IList<Employee> EmpList = new IList<Employee>(); 는 할 수 없다. 인터페이스를 인스턴스화 할 수 없다. 

 

728x90
반응형

'C#' 카테고리의 다른 글

C#] 제네릭 제약조건 : where, default 연산자  (0) 2021.12.16
C#] 값 형식 VS 참조 형식  (0) 2021.12.16
C#] LINQ 쿼리 키워드 let  (0) 2021.11.05
C#] Lambda  (0) 2021.11.05
C#] Tuple types  (0) 2021.10.13

댓글