본문 바로가기

카테고리 없음

C# 확장메서드의 개념과 작성법, 주요메서드.

1. 확장메서드의 개념

어떤 클래스에 메서드를 추가하고 싶으면 어떤 방법이 있을까요?  다음과 같은 두 가지를 생각해 볼 수 있습니다.

  • 1. 클래스를 수정한다.
  • 2. 클래스를 상속받아 새로운 파생클래스를 만든다. 

이 두 가지 방법 이외에 기존의 클래스를 손대지 않고 간단하게 메서드를 추가할 수 있는방법이 하나 더 있는데, 바로 확장메서드(Extension methods)입니다. 확장메서드를 이용하기 위해서는 전제조건이 있는데요, 바로 정적클래스(static class)이어야 한다는 것입니다. 우리가 확장메서드에 대해 알아야하는 이유는 무엇보다도 LINQ를 이해하기 위해서입니다. 확장메서드가 LINQ에 자주 사용되고, 메서드 신택스를 통해 구현되기 때문입니다. 먼저, 쉬운 예제를 통해 확장메서드 만드는 법을 알아보도록 할께요.

2. 확장메서드 만들기

목표 : "animal" 단어에 소문자 "a"를 대문자 "A"로 바꾸는 "CapitalA"라는 메서드를 C#의 기본클래스인 String클래스에 추가한다. 

다음의 그림에서 보시는 것처럼 String클래스에서 제공하는 메서드 중에 "CapitalA"라는 이름의 메서드는 없습니다. 그럼 확장메서드를 만들어서 인텔리센스에 메서드 이름이 나오도록 해보겠습니다.

C# 확장메서드 생성전

확장메서드를 만드는 법은 굉장히 간단한데요, 그냥 static 클래스를 하나 만들고 그 안에 첫번째 매개변수를 this한정자를 사용해서 확장하려는 클래스로 넘기는 메서드를 만들면 됩니다. 다음과 같이 말이죠.

namespace ExtensionMethods
{
    public static class ExtensionClass //반드시 static클래스 이어야 합니다.
    {
        public static string CapitalA(this String str) //첫번째 매개변수를 this한정자를 사용합니다.
        {
            return str.Replace("a", "A"); //메서드의 기능을 만듭니다. 
        }
    }
}

메서드를 만든 뒤 코딩을 해 보시면 아래의 그림처럼 인텔리센스에 뜨는걸 보실수 있습니다.

C# 확장메서드 생성후

전체 소스는 아래와 같습니다.

using System;
using ExtensionMethods;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("animal".CapitalA());
    }
}

namespace ExtensionMethods
{
    public static class ExtensionClass
    {
        public static string CapitalA(this String str)
        {
            return str.Replace("a", "A");
        }
    }
}

결과는 다음과 같습니다.

C# 확장메서드 결과

3. LINQ관련 주요메서드

  • Select
string[] numbers = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
    List lengths = numbers.Select(number => number.Length).ToList();

    foreach (int length in lengths)
    {
        Response.Write(length);
    }

출력결과 : 3 3 5 4 4 3 5 5 4 3

  • Where
List numbers = new List { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
    IEnumerable query = numbers.Where(number => number.Length > 4);

    foreach (string number in query)
    {
        Response.Write(number);
    }

출력결과 : threeseveneight

  • ToList
string[] numbers = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
    List lengths = numbers.Select(number => number.Length).ToList();

    foreach (int length in lengths)
    {
        Response.Write(length);
    }

출력결과 : 3 3 5 4 4 3 5 5 4 3

끝으로 확장메서드는 클래스, 구조체, 인터페이스에만 만들수 있습니다. 그리고 MS에서는 일반적으로 마구 사용하진 말것을 권장하네요.

 

프로젝트의 성공을 기원합니다.

 

MSDoc : this키워드

MSDoc : 확장메서드

 

확장 메서드 - C# 프로그래밍 가이드

확장명 메서드(C# 프로그래밍 가이드)Extension Methods (C# Programming Guide) 이 문서의 내용 --> 확장명 메서드를 사용하면 새 파생 형식을 만들거나 다시 컴파일하거나 원래 형식을 수정하지 않고도 기존 형식에 메서드를 "추가"할 수 있습니다.Extension methods enable you to "add" methods to existing types without creating a new derived type, r

docs.microsoft.com