ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unity | 반복자(IEnumerator) 와 열거자(IEnumerable)
    다시한번 개발자도전! 2026. 1. 21. 17:32

     

    이번 글은 이전 코루틴 설명 글과 이어진다.

    https://muongmong.tistory.com/65

     

    Unity | 코루틴(Coroutine)과 Async/Await(Task)

    1. 코루틴이란? 실행을 중간에 멈췄다가, 나중에 다시 시작할 수 있는 아주 특별한 함수.비유: 영화를 보다가 일시정지하고 화장실에 갔다가, 다시 돌아와서 멈춘 부분부터 이어서 보는 것과 같

    muongmong.tistory.com


    < 반복자(IEnumerator) >

    •  C#의 반복자(Iterator) 인터페이스 코루틴이 멈췄다 실행되는 건 이 인터페이스의 구조 덕분.

     

    1. IEnumerator 인터페이스의 구성 요소

    1. Current: 현재 가리키고 있는 데이터 (유니티에서는 yield return한 값).
    2. MoveNext(): 다음 위치로 이동하는 함수. 성공하면 true, 끝에 도달하면 false를 반환함.
    3. Reset(): 처음 위치로 되돌림.

    2.  작동원리 | 상태 머신 (State Machine)

    코루틴 함수를 작성하면, 컴파일러는 우리가 짠 코드를 '상태 머신' 클래스로 자동 변환.

    • yield return은 코드를 절단 지점으로 만듦.
    • MoveNext()가 호출될 때마다, 프로그램은 "지난번에 어디서 멈췄지?"를 확인하고 그 지점부터 다음 yield까지만 실행함.
    • 즉, 코루틴은 한 번에 다 실행되는 게 아니라, MoveNext()가 호출될 때마다 한 칸씩 전진하는 구조임.

    3. 유니티 엔진과의 공조 

    "그럼 누가 MoveNext()를 호출해줘?"라는 의문이 생길 거임. 바로 유니티 엔진임.

    1. 우리가 StartCoroutine(MyRoutine())을 호출함.
    2. 유니티는 IEnumerator 객체를 받아서 자신의 **'코루틴 관리 리스트'**에 등록함.
    3. 매 프레임마다 유니티는 리스트를 돌며 각 코루틴의 MoveNext()를 실행함.
    4. 만약 Current 값이 "1초 기다려"(WaitForSeconds)라면, 유니티는 1초 동안 그 코루틴의 MoveNext() 호출을 건너뜀.

    4. 코루틴 원리 예시

    IEnumerator MyIterator()
    {
        Debug.Log("1번 지점");
        yield return null; 
    
        Debug.Log("2번 지점");
        yield return null;
    }
    
    void FakeUnityEngine()
    {
        IEnumerator ie = MyIterator();
    
        ie.MoveNext(); // "1번 지점" 출력
        // (한참 뒤에...)
        ie.MoveNext(); // "2번 지점" 출력
    }

     


     

    < 열거자(IEnumerable) >

    IEnumerable은 나 요소를 하나씩 꺼내 줄 수 있는 능력이 있어!라고 선언하는 인터페이스.

    • 핵심 역할: 이 인터페이스를 상속받으면 반드시 IEnumerator GetEnumerator()라는 메서드를 구현해야 함
    • 비유: IEnumerable은 책이고, IEnumerator는 그 책을 한 페이지씩 넘기는 손가락.

    2. 반복자( IEnumerator )와 열거자 ( IEnumerable )가 나눠져 있는 이유

    • IEnumerable (책): 데이터 그 자체를 가지고 있거나, 어떻게 데이터를 꺼낼지 알고 있는 대상임. (여러 명에게 책을 빌려줄 수 있음)
    • IEnumerator (손가락): 현재 어디를 읽고 있는지 **상태(Current)**를 기억하는 도구임.

    💡책 자체가 "어디까지 읽었는지"를 기억한다면, 두 사람이 동시에 그 책을 읽을 수 없게 됨. 그래서 데이터(IEnumerable)와 읽는 도구(IEnumerator)를 분리해둔 것임.


    3. foreach문 예시

    List<string> names = new List<string> { "Kim", "Lee", "Park" };
    
    IEnumerator<string> enumerator = names.GetEnumerator(); //IEnumerator을 가져옴
    
    while (enumerator.MoveNext()) // 다음 페이지가 있으면 넘김
    {
        Debug.Log(enumerator.Current); // 현재 페이지(데이터)를 읽음
    }
    • 위 코드에서 List는 IEnumerable을 상속받았기 때문에 GetEnumerator()를 호출할 수 있는 것임.

    < 차이점 비교 >

    구분 IEnumerable IEnumerator
    의미 열거 가능한 (Enumerable) 열거자 (Enumerator)
    핵심 메서드 GetEnumerator() MoveNext(), Current
    역할 데이터를 제공하는 통로 현재 위치를 기억하고 이동함
    비유 플레이리스트 (곡 목록) 재생 헤드 (현재 재생 지점)

     

Designed by Tistory.