foreach를 사용할 수 있는 클래스를 만들려면 IEnumerable 인터페이스와 IEnumerator 인터페이스를

상속하고 이들에게 선언되어 있는 메소드와 프로퍼티를 구현해야 한다.

일반화 클래스도 IEnumerable과 IEnumerator 인터페이스를 상속하여 이들의 메소드와 프로퍼티를

구현하면 일반은 foreach를 통해 순회를 할 수 있지만, 요소를 순회할 때마다 형식 변환을 수행하는

오버로드가 발생한다는 문제가 있다.

성능을 위하여 기껏 일반화를 통해 형식 변환을 제거하였더니 foreach 구문에서 형식 변환을 일으켜

성능을 저하시키면 너무 바보 같은 일일것이다.

System.Collections.Generic 네임스페이스에는 이 문제를 풀 수 있는 열쇠를 가지고 있다.

바로 IEnumerable, IEnumerator의 일반화 버전인 IEnumerable<T>, IEnumerator<T> 인터페이스다.

이들을 상속하여 메소드와 프로퍼티를 구현하면, 형식 변환으로 인한 성능 저하가 없으면서도

foreach 순회가 가능한 클래스를 작성할 수 있다.

메소드 설명
IEnumerator GetEnumerator() IEnumerator 형식의 객체를 반환 (IEnumerable로부터 상속받은 메소드)
IEnumerator<T> GetEnumerator() IEnumerator<T> 형식의 객체를 반환

IEnumerable<T> 인터페이스는 GetEnumerator() 메소드를 두 개나 갖고 있다. 메소드들은 이름이

같지만 반환 형식이 다르다.

IEnumerator를 반환하는 버전의 GetEnumerator() 메소드는