foreach 구문을 사용하면 객체가 가지고 있는 멤버들을 순서대로 순회할수 있다

클래스에 열거 기능을 작성하려면 두 개의 인터페이스를 구현해야 한다
IEnumerable - 열거자 객체를 구하는 GetEnumerator 메소드를 가진다
자신을 열거하는 별도의 도우미 클래스를 준비해 두고 GetEnumerator 메소드에서 이 도우미 객체를 생성하여 리턴
도우미 객체는 IEnumerator 인터페이스를 상속받아 구현

IEnumerator 인터페이스에는 3개의 멤버가 포함되어 있다
object Current - 현재 값을 구한다. 열거 대상이 임의 타입이므로 object를 리턴한다
bool MoveNext() - 다음 값으로 이동하며 끝에 도달하면 false를 리턴한다
void Reset() - 열거를 처음 상태로 돌린다. 최초 아무 것도 가리키지 않는 상태여야 한다





- Time 클래스는 IEnumerable 인터페이스를 상속받으며 따라서 GetEnumerator 라는 메소드를 구현
- GetEnumerator에서는 TimeEnum타입의 객체를 하나 생성해서 리턴, 이객체가 바로 실제 열거 담당하는 열거자

- TimeEnum 클래스는 IEnumerator 인터페이스로부터 상속받은 메소드와 프로퍼티를 구현

- T 필드는 열거 대상 시간 객체이며 생성자에서 전달된 인수로 초기화
- element 필드는 시간 객체의 어떤 요소를 가리키고 있는지를 기억하는 일종의 첨자값이다
- Reset에서 -1로 초기화하며 생성자에서 Reset을 호출하므로 최초 아무 요소도 가리키고 있지 않은 상태

- MoveNext 메소드는 element를 1 증가시켜 다음 요소를 가리키도록 조정하되 2가 되면 false를 리턴하여 마지막이라는 걸 알림

- Current 프로퍼티는 element에 따라 시간 요소를 리턴

- foreach는 미리 정해진 약속에 따라 Time 객체의 열거 관련 메소드를 호출하여 열거되는 값을 hms에 대입

Posted by 코딩하는 야구쟁이
,