<유니티> Enumerator

상태
시작 전
담당자
날짜
숫자
0

Enumerator의 정의

Enumerator는 반복 가능한 객체(컬렉션)의 요소를 하나씩 순차적으로 접근하기 위한 도구입니다. 이를 통해 반복문이나 코루틴을 구현할 수 있으며, 컬렉션을 탐색하는 중요한 수단입니다.
Enumerator는 주로 IEnumerator 인터페이스를 구현하여 제공되며, IEnumerable 인터페이스를 구현한 컬렉션 객체에서 사용됩니다. 여기서 IEnumerable은 "이 컬렉션은 열거 가능하다"라는 의미로, 컬렉션의 요소들을 순회할 수 있도록 하는 기능을 정의하는 인터페이스입니다.

IEnumerable과 IEnumerator 인터페이스

IEnumerable : 컬렉션이 반복 가능하다는 것을 정의합니다. GetEnumerator() 메서드를 통해 Enumerator를 반환합니다. 이 메서드는 컬렉션을 순회하는 데 필요한 Enumerator를 제공합니다.
IEnumaerator : 이 인터페이스는 컬렉션의 요소들을 하나씩 순차적으로 접근하는 기능을 정의합니다. IEnumerator 인터페이스는 다음의 세 가지 주요 메서드와 프로퍼티를 포함합니다.
1.
MoveNext(): 다음 요소로 이동합니다. 더 이상 요소가 없으면 false를 반환하고, 있으면 true를 반환합니다.
2.
Current: 현재 위치에 있는 요소를 반환합니다.
3.
Reset(): Enumerator를 컬렉션의 처음으로 되돌립니다. 하지만 대부분의 컬렉션에서는 이 기능을 제공하지 않습니다. (구현하기에 비효율적)

IEnumerator의 동작 원리

1.
초기 상태 : Enumerator가 생성되면 컬렉션의 첫 번째 요소 이전에 위치합니다.
2.
MoveNext() 호출 : 이 메서드를 호출하면, Enumerator는 다음 요소로 이동합니다. 즉, 첫 번째 요소로 이동하려면 MoveNext()를 한 번 호출해야 하는 것이죠.
3.
Current 프로퍼티 : Enumerator가 가리키고 있는 현재 요소를 반환합니다. Current는 처음에 유효한 값을 가리키지 않으며, 반드시 MoveNext()를 호출한 후 접근해야 합니다.
4.
종료 상태 : MoveNext()가 호출되고 나서 컬렉션의 끝에 도달하면 false가 반환됩니다. 더 이상 순회할 요소가 없음을 의미합니다.

예시 코드

using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnumeratorTest : MonoBehaviour { private void Start() { // List<string> 생성 List<string> colors = new List<string> { "Red", "Green", "Blue" }; // IEnumerable 인터페이스를 사용해 컬렉션 순회 IEnumerable<string> enumerableColors = colors; // GetEnumerator()로 Enumerator를 얻음 IEnumerator<string> enumerator = enumerableColors.GetEnumerator(); // MoveNext로 다음 요소로 이동하고, Current로 현재 요소를 가져옴 while (enumerator.MoveNext()) { string color = enumerator.Current; Debug.Log(color); } } }
C#
복사
위 코드는 List<string> 컬렉션 내의 요소들을 차례대로 순회하면서 출력하는 예제 코드입니다.

Enumerator의 장점

1.
일관된 컬렉션 순회 : 다양한 컬렉션(List, Array, Dictionary 등)에서 동일한 방법으로 순회할 수 있습니다. IEnumerable 인터페이스를 구현하기만 하면 됩니다.
2.
메모리 효율성 : Enumerator는 컬렉션 전체를 한 번에 로드하는 것이 아니라, 요소를 하나씩 처리하므로 대용량 데이터를 처리할 때 메모리 효율이 높습니다.
3.
안전한 데이터 접근 : 컬렉션의 요소를 순회하는 동안 직접적으로 요소를 변경하는 것을 방지해 데이터 무결성을 보장합니다.

Enumerator의 단점 및 고려 사항

1.
수정 불가 : Enumerator를 사용하는 동안 컬렉션의 요소를 수정할 수 없습니다. 이는 InvalidOperationException을 발생시킬 수 있습니다. 따라서 읽기 전용으로 사용하는 것이 주된 용도입니다.
2.
불안정성 : 만약 컬렉션의 크기가 변경되면 Enumerator는 더 이상 유효하지 않을 수 있습니다. 예를 들어, 컬렉션에서 요소가 추가되거나 제거되면 Enumerator는 예외를 발생시킬 수 있습니다.

foreach와 Enumerator의 상관관계

foreachEnumerator는 서로 밀접한 관계가 있습니다. foreach는 사실 내부적으로 Enumerator를 사용하여 컬렉션을 순회하는 구조를 가지고 있습니다. 이 두 가지는 모두 컬렉션의 요소들을 반복적으로 처리할 때 사용되지만, 각각의 사용 방식과 적합한 상황은 조금 다릅니다. 하나씩 차이를 설명하고, 언제 각 방법이 유용한지 알아보겠습니다.
foreach 구문은 C#에서 컬렉션을 간단하게 순회할 수 있게 해주는 구문입니다. 내부적으로는 IEnumerator 인터페이스를 사용하여 동작하며, 컬렉션에서 GetEnumerator() 메서드를 호출해 IEnumerator 객체를 가져온 후, MoveNext()Current를 사용해 반복을 진행합니다.