IEnumerator

IEnumerator는 UnityEngine을 다루는 사람이라면 코루틴 덕분에 익숙한 키워드 일 것이다.

C#관련 키워드이기 때문에 관련 정보는 MSDN에서 가장 잘 설명되어 있다.

“IEnumerator (열거자)란 컬렉션을 단순하게 반복할 수 있도록 지원합니다.”

이렇게 보면 C++의 컨테이너를 반복하는 Iterator (반복자)와 비슷한 개념이다.

IEnumerator는 System.Collections 네임스페이스에 구현되어 있는 인터페이스이다.

이 인터페이스내에 구현된 프로퍼티와 메서드는 다음과 같다.

public interface IEnumerator
{
		object Current // 현재 컬렉션의 위치를 반환하는 정보
		{
			get;
		}
		
		bool MoveNext(); // 다음위치로 이동하면서 성공하면 true를 return 하는 메서드
		void Reset(); // 위치를 처음으로 초기화하는 메서드
}

참고로 제네릭이 아닌 버전의 IEnumerator는 값타입을 object로 박싱하게 되므로 사용자정의 IEnumerator를 구현하기 위해서는 <T>로 제네릭을 이용하는 것이 좋다.

// boxing되는 예시
void Start()
{
    Debug.Log("테스트 시작");
    var temp = TestEnumerator();
    Debug.Log($"현재 값 : {temp.Current}");
    temp.MoveNext();
    Debug.Log($"현재 값 : {temp.Current}");
    temp.MoveNext();
    Debug.Log($"현재 값 : {temp.Current}");
}

IEnumerator TestEnumerator()
{
    yield return 1;
    yield return 2;
}

//출력물은 Null, 1, 2가 나온다
// 일단 Null이 나오는 이유는 따로 제네릭을 활용하지 않았으니 박싱이 발생해서 참조타입으로
// 변환되었기 때문이다 그리고 IEnumrator는 MoveNext()호출 전까지는 원하는 값이 나오지않는다.
// 저기서 TestEnumerator의 리턴값을 IEnumerator<int>로 제네릭으로 선언하면 0 , 1, 2가 나온다.

IEnumerable

IEnumerator와 비슷한 이름의 IEnumerable에 대해서 알아보자

이것도 C#관련 키워드이기 때문에 관련 정보는 MSDN에서 가장 잘 설명되어 있다.

“IEnumerable은 컬렉션에서 열거자를 노출합니다.”

간단하게 말하면 IEnumerator를 리턴시키는 Getter의 역할을 하는 인터페이스이다.

public interface IEnumerable
{
	IEnumerator GetEnumerator();
}