개요

C# 언어의 핵심 인터페이스인 IEnumerableIEnumerable<T> 에 대해서 개념적으로 이해하고

실무에서 어떻게 활용할 수 있는 지 정리해본다.

특히 Unity 환경에서 사용한 사례를 가져와서 게임 개발에 있어서 언제, 어떻게 사용하면 유용한지 습득할 수 있도록 정리해본다.

개념

IEnumerable은 C#에서 컬렉션 또는 데이터 집합을 **순회(iteration)**할 수 있도록 해주는 인터페이스이다.

여기서 순회가 가능하다는 말은, 어떤 데이터 집합 안에 들어가 있는 요소들을 하나씩 꺼내면서 처리할 수 있다는 의미이다.

즉, foreach문을 통해 데이터를 하나씩 처리할 수 있는 객체를 의미하며,

List, Array, Dictionary, HashSet 등 대부분의 컬렉션 클래스는 이 인터페이스를 구현하고 있다.

그렇다면 IEnumerable<T>와 IEnumerable의 차이는 뭘까?

항목 IEnumerable IEnumerable<T>
타입 비제네릭 제네릭
반환 타입 IEnumerator IEnumerator<T>
요소 타입 항상 object 명시된 타입 T
사용 예 옛날 .NET, 비타입 안전 상황 LINQ, 타입 안전, 성능 최적화
박싱 발생 있음 (object 캐스팅 필요) 없음

공통적으로 순회 가능한 객체를 정의하는 인터페이스이다.

다만 반환 타입과 요소 타입에서 차이가 있다. 아래 코드를 보면

// IEnumerable (object로 반환 → 캐스팅 필요)
IEnumerable oldList = new List<int> { 1, 2, 3 };
foreach (object item in oldList)
    Debug.Log((int)item); // 직접 캐스팅 필요

// IEnumerable<T> (타입 명확 → 안전함)
IEnumerable<int> typedList = new List<int> { 1, 2, 3 };
foreach (int item in typedList)
    Debug.Log(item); // 캐스팅 필요 없음

IEnumerableIEnumerable<T>의 실질적인 차이를 보여준다.

IEnumerable 제네릭이 아니기 때문에 요소의 타입이 object로 간주된다.

그래서 item은 object로 받아지며, 실제 사용할 땐 명시적 캐스팅이 필요하다.