C#/LINQ

[C#]LINQ 빈 값으로 설정 - Empty 메서드

DevStory 2022. 8. 14.

Empty 메서드

지난 포스팅에서 데이터를 생성하는 메서드인 Range(), Repeat() 메서드에 대해 설명하였습니다.

 

[C#]LINQ 지정된 범위 또는 횟수만큼 데이터 생성 - Range, Repeat 메서드

생성 연산자 지금까지는 Join, Select, Where, Take 메서드 등... 데이터 집합에서 원하는 데이터를 추출하는 방법을 소개했습니다. 이번 포스팅은 데이터를 생성할 수 있는 두 가지 메서드를 소개합니

developer-talk.tistory.com

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() 메서드를 사용하면, 빈 데이터 집합이 메모리에 생성되지 않습니다. 따라서, 가비지 컬렉션이 처리해야 하는 작업이 줄어듭니다.

 

추측이지만 싱글톤 패턴으로 빈 데이터 집합을 공유하지 않을까 싶습니다.

 

자세한 내용은 아래 링크에서 확인할 수 있습니다. 

 

Is it better to use Enumerable.Empty<T>() as opposed to new List<T>() to initialize an IEnumerable<T>?

Suppose you have a class Person : public class Person { public string Name { get; set;} public IEnumerable<Role> Roles {get; set;} } I should obviously instantiate the Roles in the

stackoverflow.com

반응형

댓글