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();
}