반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[C# 교과서] 26. C# 확장 기능(1) - 확장 메서드 만들기 본문

C# 기초

[C# 교과서] 26. C# 확장 기능(1) - 확장 메서드 만들기

HYOKYE0NG 2022. 1. 25. 08:35
반응형
확장 메서드 만들기

 

확장 메서드

 

  • 확장 메서드(extension method)는 원본 형식을 변경하지 않고 이미 있는 형식에 추가로 기능을 덧붙일 수 있다.
  • 확장 메서드는 이미 만들어져 있는 클래스 기능을 확장하고, 클래스와 구조체, 인터페이스에서 사용할 수 있다.
  • 특히 봉인(sealed) 클래스는 상속이 불가능하므로 봉인 클래스에 새로운 메서드를 적용하기가 유용하다.
  • 확장 메서더는 static 키워드가 붙은 클래스에 static 메서드로 만들어지며 반드시 동일한 네임스페이스를 참조해야 한다.
  • 확장 메서드의 첫 번째 매개변수에 this 키워드를 지정하여 확장 메서드를 사용할 개체 형식을 선택할 수 있다.
public static void MethodName(this object obj, int i) { }
public static void MethodName(this string str, int i) { }

첫 번째 매개변수는 직접 넘겨주는 것이 아닌 정적 메서드로 호출할 개체 형식을 표현한다.

 

확장 메서드 특징

  • 정적(static) 클래스에 정적(static) 메서드로 구현한다.
  • 첫 번째 메서드 매개변수에 this 클래스를 붙인다.
  • 같은 범위(scope)를 같은 네임스페이스에서 호출할 수 있다.
  • 확장 메서드로 오버로드가 가능하다.

 

 

확장 메서드로 문자열 기능 확장하기

using System;

static class ExtensionFunction
{
    // static 클래스안에 static 메서드의 첫번째 매개 변수에 this가 붙은 것은 확장 메서드
    static string Three(this string value)
    {
        // 특정 문자열 뒤에 이 메서드가 호출되면 문자열 중 3개만 반환 
        return value.Substring(0, 3);
    }

    static void Main()
    {
        Console.WriteLine("안녕하세요.".Three()); //안녕하
    }
}

static 클래스 안에 static 메서드를 만들고, 메서드의 첫 번째 매개변수에 this를 붙이면 확장 메서드가 된다.

Three() 메서드는 특정 메서드 뒤에 붙이면 해당 문자열 중 앞 세글자만 반환한다.

 

 

확장 메서드로 기존 형식에 새로운 메서드 추가하기

using System;

namespace ExtensionMethodDemo
{
    // static 정적(고정) == shared(공유)
    public static class MyClass
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' },
                StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }

    class ExtensionMethodDemo
    {
        static void Main()
        {
            string s = "안녕하세요? 확장 메서드... ...";
            Console.WriteLine(s.Length); // [1] 문자의 개수: 20
            Console.WriteLine(s.WordCount()); // [2] 단어의 개수: 3
        }
    }
}

문자열 변수 s에는 원래 WordCount()라는 메서드가 없지만,

같은 네임스페이스에 정의된 MyClass의 WordCount() 확장 메서드를 s 변수에서 사용할 수 있게 한 것이다.

 

 

확장 메서드를 사용하여 형식에 메서드 추가하기

using System;

public class Original { /* Empty */ }

public static class OriginalExtension
{
    public static void NewMethod(this Original original) 
        => Console.WriteLine("새로운 메서드 추가");
}

class ExtensionMethodNote
{
    static void Main()
    {
        (new Original()).NewMethod(); // 확장 메서드 호출 
    }
}

//새로운 메서드 추가

Original 클래스는 아무 멤버도 갖지 않은 클래스이지만,

OriginalExtension 클래스에서 NewMethod()를 참조해서 새로운 메서드를 추가하여 사용할 수 있다.

 

 

 

 

 

<Reference>

 

반응형
Comments