마이 플밍 블로그

C# 확장메서드 (Extension Method) 본문

Code/C#

C# 확장메서드 (Extension Method)

레옹 2021. 9. 28. 05:19

간혹 프로그램을 작성하다 보면 특정 클래스에 메서드를 추가하고 싶은 경우가 있다.

그게 내가 만든 클래스라면 직접 파일을 열어서 추가하면 되지만

외부 라이브러리를 사용할 시 직접 수정하지 못하게 막아놓은 경우도 있을 것이다.

 

그럴 경우에 사용하면 되는 것이 확장메서드이다.

확장메서드를 사용할 시 클래스 내부가 아닌 외부에서 메서드를 정의함으로서 

기존 형식의 코드변경 없이 외부에서 대상 형식에 메서드를 추가할 수 있다.

 

확장메서드 만들기

확장메서드는 static클래스 안에서 static 메서드로 정의된다.

 

    public static class ExtensionMethod {
        public static void TestExtensionMethod1(this string a) {
            Console.WriteLine("TestExtensionMethod1");
        }
        public static void TestExtensionMethod2(this string a, int num) {
            Console.WriteLine("TestExtensionMethod2 " + num);
        }
        public static void TestExtensionMethod3(this string a, int num, string str) {
            Console.WriteLine("TestExtensionMethod3 " + num + " " + str);
        }
    }

위 예제는 string클래스의 확장 메서드이다.

확장메서드는 첫번 째 파라미터에서 확장메서드의 타입을 정해주는데 타입 앞에 this를 붙여서

확장메서드를 만들 수 있다.

그리고 두번 째 파라미터 부터는 확장메서드에 쓰일 파라미터를 적을 수 있다.

 

결과

        static void Main(string[] args) {
            string test = "a";
            test.TestExtensionMethod1(); // "TestExtensionMethod1"
            test.TestExtensionMethod2(50); // "TestExtensionMethod2 50"
            test.TestExtensionMethod3(100, "Method3"); // "TestExtensionMethod3 100 Method3"
        }

직접 작성한 확장메서드를 이용해보면 오른쪽 주석과 같은 결과가 나온다.

 

Linq

확장메서드는 Linq에서 굉장히 많이 사용되는 편이다.

아래는 그 예시들이다.

            string[] people = new string[] { "Tom", "Jerry", "Tomas", "Kay", "Camel" };
            IEnumerable enumerable = people.Where(peo => peo.Length > 3);
            IEnumerator enumerator = enumerable.GetEnumerator();
            while (enumerator.MoveNext()) {
                string name = (string)enumerator.Current;
                Console.WriteLine(name); // Jerry Tomas Camel
            }
            string[] people = new string[] { "Tom", "Jerry", "Tomas", "Kay", "Camel" };
            List<string> name = people.Select(peo => peo.Substring(0, 3)).ToList();
            for(int i = 0;i < name.Count; i++) {
                Console.WriteLine(name[i]); // Tom Jer Tom Kay Cam
            }

 

확장메서드는 너무 남용하면 좋지않기에 주의하며 사용하자.

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

[C#] GC(Garbage Collector)의 작동원리  (0) 2022.04.03
Regular Expression  (0) 2021.09.27