프로그래밍(Programming)/C#

확장명 메서드 : 기존 class 에 기능 추가하기(this) (1)

3DMP 2018. 9. 6. 23:32


확장명 메서드를 사용하면 새 파생 형식을 만들거나 다시 컴파일하거나 원래 형식을 수정하지 않고도 기존 형식에 메서드를 "추가"할 수 있습니다. 확장 메서드는 특수한 종류의 정적 메서드이지만 확장 형식의 인스턴스 메서드인 것처럼 호출됩니다. C#, F# 및 Visual Basic에서 작성된 클라이언트 코드의 경우 확장명 메서드를 호출하는 것과 형식에 실제로 정의된 메서드를 호출하는 데는 명백한 차이가 없습니다.


다음 예제에서는 정수 배열에서 표준 쿼리 연산자 OrderBy를 호출하는 방법을 보여 줍니다. 괄호 안의 식은 람다 식입니다. 많은 표준 쿼리 연산자가 람다 식을 매개 변수로 사용하지만 확장명 메서드에 대한 요구 사항은 아닙니다. 자세한 내용은 람다 식을 참조하세요.



가장 일반적인 확장명 메서드는 쿼리 기능을 존 System.Collections.IEnumerable 및 

System.Collections.Generic.IEnumerable<T>  형식에 추가하는 LINQ 표준 쿼리 연산자입니다.


표준 쿼리 연산자를 사용하려면 using System.Linq 지시문을 사용해서 먼저 범위를 지정합니다. 

그러면 IEnumerable<T>을 구현하는 모든 형식에 GroupByOrderByAverage 등의 인스턴스 메서드가 있는 것처럼 나타납니다. 


List<T> 또는 Array와 같은 IEnumerable<T> 형식의 인스턴스 뒤에 "dot"를 입력하면 IntelliSense 문 완성에서 

이러한 추가 메서드를 볼 수 있습니다.



//상단에 아래 구문 필요

using System.Linq;


class ExtensionMethods2 { static void Main() { int[] ints = { 10, 45, 15, 39, 21, 26 }; var result = ints.OrderBy(g => g); foreach (var i in result) { System.Console.Write(i + " "); } } } //Output: 10 15 21 26 39 45


확장명 메서드는 정적 메서드로 정의되지만 인스턴스 메서드 구문을 사용하여 호출됩니다. 확장 메서드의 첫 번째 매개 변수는 메서드가 작동하는 형식을 지정하며 매개 변수 앞에 this 한정자가 있습니다. 확장 메서드는 using 지시문을 사용하여 명시적으로 네임스페이스를 소스 코드로 가져오는 경우에만 범위에 있습니다.

다음 예제에서는 System.String 클래스에 대해 정의된 확장 메서드를 보여 줍니다. 이 확장 메서드는 제네릭이 아닌 비중첩 정적 클래스 내부에서 정의됩니다.


namespace ExtensionMethods { public static class MyExtensions { public static int WordCount(this String str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } }


WordCount 지시문을 사용하여 using 확장 메서드를 범위로 가져올 수 있습니다.

using ExtensionMethods;


또한 다음 구문을 사용하여 응용 프로그램에서 확장 메서드를 호출할 수 있습니다.

string s = "Hello Extension Methods"; int i = s.WordCount();


코드에서 인스턴스 메서드 구문을 사용하여 확장 메서드를 호출합니다. 그러나 컴파일러에서 생성된 IL(중간 언어)이 코드를 정적 메서드 호출로 변환합니다. 따라서 실제로 캡슐화의 원칙을 위반하지 않습니다. 사실상 확장명 메서드는 확장하는 형식의 private 변수에 액세스할 수 없습니다.

자세한 내용은 방법: 사용자 지정 확장 메서드 구현 및 호출을 참조하세요.

일반적으로 확장명 메서드를 직접 구현하는 것보다 호출하는 경우가 훨씬 많습니다. 확장 메서드는 인스턴스 메서드 구문을 사용하여 호출되므로 특별한 지식이 없어도 클라이언트 코드에서 확장 메서드를 사용할 수 있습니다. 특정 형식의 확장 메서드를 사용하려면 해당 메서드가 정의된 네임스페이스에 대해 using 지시문을 추가합니다. 예를 들어 표준 쿼리 연산자를 사용하려면 다음 using 지시문을 코드에 추가합니다.

using System.Linq;

System.Core.dll에 대한 참조를 추가해야 할 수도 있습니다. 이제 표준 쿼리 연산자가 대부분의 IEnumerable<T> 형식에 사용할 수 있는 추가 메서드로 IntelliSense에 표시됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using MyNamespace;
using System;
 
 
namespace MyNamespace
{
    public static class MyClass
    {
 
        //확장메서드를 사용할 경우 인자에 this 를 써주야 한다
        public static int WordCount(this String str)
        {
            //return str.Split(' ').Length;
            return str.Split(new char[] { ' ''.''?' },
                StringSplitOptions.RemoveEmptyEntries       //공백은 무시
                ).Length;
        }
    }
}
 
class DemoClass
{
    static void Main(string[] args)
    {
        string ss="sdf sdf";
        Console.WriteLine(ss.WordCount());
    }
 
}
 

cs

결과 : 2


ref : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/extension-methods




반응형