C#/LINQ

[C#]LINQ 확장 메서드

DevStory 2022. 7. 10.

LINQ 확장 메서드

LINQ의 Where(), Union(), Join() 메서드 등.. 해당 메서드들은 Enumerable 클래스에서 구현됩니다. 이 메서드들은 IEnumerable<T> 인터페이스 타입의 확장 메서드로 구현됩니다.

 

다음 예제를 살펴봅시다.

List<string> strArr = new List<string>{ 
  "Apple", "Banana", "Car", "Angular", "Add", "Sum" 
};

IEnumerable<string> linqResult = 
  strArr.Where(item => item.StartsWith("A"));

컬렉션 클래스인 List에는 다음 사진처럼 Where() 메서드가 존재하지 않지만, Where() 메서드를 호출해도 전혀 문제가 없습니다.

System.Linq 네임스페이스에 존재하는 Enumerable 클래스를 확인해보면 Where() 메서드는 다음과 같이 정의되어있습니다.

public static IEnumerable<TSource> Where<TSource>(
  this IEnumerable<TSource> source, 
  Func<TSource, bool> predicate
);

public static IEnumerable<TSource> Where<TSource>(
  this IEnumerable<TSource> source, 
  Func<TSource, int, bool> predicate
);

오버로드된 두 가지 버전이 존재하며 Where() 메서드는 IEnumerable<T> 인터페이스에서 확장 메서드로 구현됩니다. 그리고 LIst<T>는 IEnumerable<T> 인터페이스를 구현합니다.

 

따라서 List<T> 객체를 사용하여 Where() 메서드를 호출할 수 있습니다.

 

설명이 많이 어려웠는데 쉽게 이야기하자면 확장 메서드는 클래스나 인터페이스를 상속하지 않아도 메서드를 추가할 수 있는 기능입니다. 따라서, List에는 Where() 메서드가 없지만, Enumerable 클래스가 Where() 메서드를 확장 메서드로 구현함으로써 List는 Where() 메서드를 사용할 수 있습니다.

 

Where() 메서드가 확장 메서드인 이유와 확장 메서드를 구현하는 방법은 아래 포스팅에서 확인할 수 있습니다.

 

[C#]확장 메서드(Extension Method)

확장 메서드(Extension Method) 확장 메서드는 C# 3.0에 추가된 새로운 기능으로 클래스 또는 인터페이스를 상속하거나 재구성하지 않고 클래스에 메서드를 추가할 수 있습니다. 확장 메서드는 클래스

developer-talk.tistory.com

다음은 List 객체가 Where() 메서드를 호출할 수 있는 과정을 설명합니다.

  1. System.Linq 네임스페이스에 존재하는 정적 클래스인 Enumerable에 Where()이라는 확장 메서드가 존재합니다.
  2. Where() 메서드 구문을 보면 this IEnumerable<TSource> source라는 인수가 존재합니다. IEnumerable<T> 인터페이스에는 Where() 메서드가 없지만, 정적 클래스 Enumerable에서 Where() 메서드를 IEnumerable<T> 인터페이스에 추가한 것이죠.
  3. System.Collections 네임스페이스에 존재하는 List 클래스는 IEnumerable<T>를 상속합니다. 따라서 확장 메서드인 Where() 메서드를 호출할 수 있게 됩니다.

만약 System.Linq를 using문에 추가하지 않고 Where() 메서드를 호출하면 어떻게 될까요?

using System;
//using System.Linq;
using System.Collections.Generic;

namespace CSharpProgramming
{
  class Program
  {
    static void Main(string[] args)
    {
      List<string> strArr = new List<string> { 
        "Apple", "Banana", "Car", "Angular", "Add", "Sum" 
      };

      IEnumerable<string> linqResult = 
        strArr.Where(item => item.StartsWith("A"));

      foreach (var str in linqResult)
        Console.Write(str + " ");
    }
  }
}

[에러 내용]

System.Linq를 using문에서 제거하면 에러가 발생하는데, Where() 메서드를 확장하는 정적 클래스 Enumerable가 없기 때문에 List 객체는 Where() 메서드를 호출할 수 없습니다.


정리

  • 확장 메서드는 클래스, 인터페이스 상속 없이 메서드를 추가할 수 있는 C#의 강력한 기능입니다.
  • System.Linq의 Enumerable 클래스에는 Where(), Union(), Join()와 같은 확장 메서드가 존재합니다.
  • System.Collections의 List에는 Where() 메서드가 없지만, Enumerable 클래스에 확장 메서드가 존재하므로 Where() 메서드를 호출할 수 있습니다.
반응형

'C# > LINQ' 카테고리의 다른 글

[C#]LINQ SelectMany 메서드  (0) 2022.07.10
[C#]LINQ Select절  (0) 2022.07.10
[C#]LINQ와 IEnumerable, IQueryable 인터페이스  (0) 2022.07.10
[C#]LINQ 중복 제거  (0) 2022.07.10
[C#]LINQ 질의 구문과 메서드 구문  (0) 2022.07.10

댓글