Empty 메서드
지난 포스팅에서 데이터를 생성하는 메서드인 Range(), Repeat() 메서드에 대해 설명하였습니다.
C#의 Linq는 또 다른 생성 메서드인 Empty() 메서드를 제공합니다.
public static IEnumerable<TResult> Empty<TResult>();
Empty() 메서드는 매개변수가 존재하지 않으며 TResult 타입(제네릭 타입)인 IEnumerable<TResult>를 반환합니다.
예제 1. Empty 메서드 사용 방법
다음 예제는 List 객체와 익명 타입(var)의 변수를 Empty() 메서드를 사용하여 빈 값으로 할당합니다.
Empty() 메서드는 IEnumerable<TResult>를 반환합니다. 따라서, ToList() 메서드를 사용하여 List 형식으로 반환하도록 합니다.
class Program
{
static void Main(string[] args)
{
List<string> strList = Enumerable.Empty<string>().ToList();
var intList = Enumerable.Empty<int>();
Console.WriteLine("strList의 Count: " + strList.Count());
Console.WriteLine("intList의 Count: " + intList.Count());
}
}
[실행 결과]
strList의 Count: 0
intList의 Count: 0
예제 2. Empty 메서드의 필요성
다음 예제처럼 List와 같은 데이터 집합을 특정 메서드로 초기화한다고 생각합시다.
class Program
{
private static List<string> getInit()
{
return null;
}
static void Main(string[] args)
{
List<string> strList = getInit();
Console.WriteLine("strList의 Count: " + strList.Count());
}
}
[에러 내용]
데이터 집합이 null로 할당된 상태에서 특정 작업을 수행하는 경우 ArgumentNullException이 발생합니다.
따라서, 데이터 집합이 null로 할당되지 않도록 Empty() 메서드를 사용합니다.
다음 예제는 NULL-COALESCING 연산자를 사용합니다.
getInit() 메서드가 null을 반환하는 경우 Empty() 메서드를 호출합니다.
class Program
{
private static List<string> getInit()
{
return null;
}
static void Main(string[] args)
{
List<string> strList = getInit() ?? Enumerable.Empty<string>().ToList();
Console.WriteLine("strList의 Count: " + strList.Count());
}
}
[실행 결과]
strList의 Count: 0
Empty 메서드의 특징
Empty() 메서드에 대해 공부하면서 한 가지 의문이 생길 수 있습니다.
class Program
{
static void Main(string[] args)
{
IEnumerable<string> strList1 = Enumerable.Empty<string>();
List<string> strList2 = new List<string>();
}
}
Empty() 메서드를 사용하여 IEnumerable 타입의 객체를 빈 값으로 초기화하는 방법과 new 연산자로 컬렉션을 빈 값으로 초기화하는 방법은 큰 차이가 없어 보입니다.
IEnumerable 인터페이스를 모르는 개발자에게는 Empty() 메서드가 생소할 수도 있겠네요.
new 연산자를 사용하여 빈 배열 또는 컬렉션을 생성하는 경우 빈 객체가 메모리에 생성됩니다. 따라서, 해당 객체를 사용하지 않는 시점 또는 애플리케이션이 종료되는 시점에 가비지 컬렉션(Garbage Collections)이 빈 객체를 메모리에서 수거하는 작업이 필요합니다.
하지만, Empty() 메서드를 사용하면, 빈 데이터 집합이 메모리에 생성되지 않습니다. 따라서, 가비지 컬렉션이 처리해야 하는 작업이 줄어듭니다.
추측이지만 싱글톤 패턴으로 빈 데이터 집합을 공유하지 않을까 싶습니다.
자세한 내용은 아래 링크에서 확인할 수 있습니다.
'C# > LINQ' 카테고리의 다른 글
[C#]LINQ 결과를 리스트 또는 배열로 반환 - ToList, ToArray 메서드 (0) | 2022.08.14 |
---|---|
[C#]LINQ 데이터 추가 방법 - Append, Prepend 메서드 (0) | 2022.08.14 |
[C#]LINQ 지정된 범위 또는 횟수만큼 데이터 생성 - Range, Repeat 메서드 (0) | 2022.08.14 |
[C#]LINQ 특정 조건을 만족하는 데이터 생략하기 - SkipWhile 메서드 (0) | 2022.08.14 |
[C#]LINQ 특정 개수만큼 생략 - Skip 메서드 (0) | 2022.08.11 |
댓글