System.Linq 란?
System.Linq 라이브러리는 언어 통합 질의(Query)
를 지원하는 기능을 제공하는 라이브러리 이다.
.NET Franmework에서 제공되며, IEnumerable
를 구현한 컬렉션 타입을 대상으로
데이터를 필터링, 정렬, 그룹화 등 다양한 작업을 수행할 수 있도록 다양한 확장 메서드를 제공한다.
유니티에서의 Linq
마이크로 소프트의 공식문서인 Unity에 대한 성능 권장사항에 따르면
Linq는 읽고 쓰기 쉽지만 일반적으로 수동으로 알고리즘을 작성하는 경우보다 더 많은 계산과 메모리가 필요
하기 때문에 사용하지 않는 것이 권장
된다.
IEnumerable 란?
C# 에서 제공 하는 System.Collections에 정의된 인터페이스로,
열거 가능한 (Enumerable) 컬렉션을 나타내는
인터페이스`
이 IEnumerable 인터페이스를 사용해서
List
,Array
,Queue
,Dictionary
등의 다양한 자료구조가 구현되어 있다.
제네릭 형식 란?
동일한 코드를 다양한 타입에 대해 재사용할 수 있도록 제공하는 기능으로 타입을 매개변수화
하여 타입에 대해 일반화된 동작을 수행하도록 한다.
IEnumerable 인터페이스의 제네릭 타입인 IEnumerable
제네릭 형식의 권장과 박싱 언박싱
제네릭 형식 IEnumerable
그 이유는 제네릭이 아닌 IEnumerable로 구현된 컬렉션 같은 경우
컬렉션에 데이터를 추가할때 박싱
(즉, 데이터 타입을 Object타입
으로 변환 값 -> 참조 타입으로 형 변환)
그리고 요소를 가져올때 언박싱
(즉, 데이터 타입을 원하는 타입으로 형 변환
참조 -> 값 타입으로 형 변환)
하는 과정이 필요하고 이는 성능 저하가 발생하고 타입의 안정성도 떨어지기 때문이다.
박싱과 언박싱에서 중요한 내용은 값 -> 참조, 참조 -> 값으로 형 변환을 한다는 것이다.
결국 박싱과 언박싱은 박싱 - 스택 메모리 영역에 있는 데이터를 힙 영역에 할당하거나 , 언박싱 - 힙 메모리 영역에 있는 데이터를 스택 영역에 할당하고 그 과정에서 메모리를 새로 할당하고 가비지 컬렉터로 메모리를 정리하는 등의 비용도 필요하기 때문에 권장되지 않는다.