• Home
  • About
    • KKsDev photo

      KKsDev

      게임 프로그래머를 목표로 Unity, C#을 공부하고 있습니다.

    • Learn More
    • Email
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

C# Linq, IEnumerable, Generic, 박싱 언박싱

28 Jul 2023

Reading time ~1 minute

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타입으로 변환 값 -> 참조 타입으로 형 변환)

그리고 요소를 가져올때 언박싱 (즉, 데이터 타입을 원하는 타입으로 형 변환 참조 -> 값 타입으로 형 변환)

하는 과정이 필요하고 이는 성능 저하가 발생하고 타입의 안정성도 떨어지기 때문이다.

박싱과 언박싱에서 중요한 내용은 값 -> 참조, 참조 -> 값으로 형 변환을 한다는 것이다.

결국 박싱과 언박싱은 박싱 - 스택 메모리 영역에 있는 데이터를 힙 영역에 할당하거나 , 언박싱 - 힙 메모리 영역에 있는 데이터를 스택 영역에 할당하고 그 과정에서 메모리를 새로 할당하고 가비지 컬렉터로 메모리를 정리하는 등의 비용도 필요하기 때문에 권장되지 않는다.



CSharp Share Tweet +1