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>(); 는 할 수 없다. 인터페이스를 인스턴스화 할 수 없다.
'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 |
댓글