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() 메서드가 확장 메서드인 이유와 확장 메서드를 구현하는 방법은 아래 포스팅에서 확인할 수 있습니다.
다음은 List 객체가 Where() 메서드를 호출할 수 있는 과정을 설명합니다.
- System.Linq 네임스페이스에 존재하는 정적 클래스인 Enumerable에 Where()이라는 확장 메서드가 존재합니다.
- Where() 메서드 구문을 보면 this IEnumerable<TSource> source라는 인수가 존재합니다. IEnumerable<T> 인터페이스에는 Where() 메서드가 없지만, 정적 클래스 Enumerable에서 Where() 메서드를 IEnumerable<T> 인터페이스에 추가한 것이죠.
- 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 |
댓글