C# 언어의 핵심 인터페이스인 IEnumerable
및 IEnumerable<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); // 캐스팅 필요 없음
IEnumerable
과 IEnumerable<T>
의 실질적인 차이를 보여준다.
IEnumerable
은 제네릭이 아니기 때문에 요소의 타입이 object로 간주된다.
그래서 item은 object로 받아지며, 실제 사용할 땐 명시적 캐스팅이 필요하다.