블로그 이미지
따시쿵

calendar

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

Notice

'c# 람다식'에 해당되는 글 4

  1. 2015.06.11 람다식(Lambda Expression) - 4
  2. 2015.06.09 람다식(Lambda Expression) - 3
  3. 2015.06.09 람다식(Lambda Expression) - 2
  4. 2015.06.08 람다식(Lambda Expression) - 1
2015. 6. 11. 16:15 C#

 

3. LINQ를 이용한 방법으로 표현하는 경우

using System;
using System.Collections.Generic;
using System.Linq;

namespace MylambdaExpression11
{
    class Program
    {
        static void Main(string[] args)
        {
            // 예제 - 1 
            // 다음 예제에서는 Func<T, TResult> 델리게이트를 선언하고 사용하는 방법을 보여 줍니다. 
            // 이 예제에서는 Func<T, TResult> 변수를 선언하고 문자열의 문자를 대문자로 변환하는 람다 식을 할당합니다. 
            // 이 메서드를 캡슐화하는 대리자는 이후에 문자열 배열의 문자열을 대문자로 변환하기 
            // 위해 Enumerable.Select 메서드에 전달됩니다. 

            Func<string, string> selector = (string s) => s.ToUpper();

            string[] words = {"orange", "apple", "Article", "elephant", "korea", "komani" };

            IEnumerable<string> aWords = words.Select(selector);

            foreach(string word in aWords)
                Console.WriteLine(word);

            Console.WriteLine();

            // 에제 - 2
            // words 배열에서 소문자 "k"로 시작하는 단어를 찾아서 알려줍니다.
            int count = words.Count(s => s.StartsWith("k"));
            Console.WriteLine("count = {0}", count);

            Console.ReadLine();
        }
    }
}

 

실행화면 입니다.

 

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

람다식(Lambda Expression) - 3  (0) 2015.06.09
람다식(Lambda Expression) - 2  (0) 2015.06.09
람다식(Lambda Expression) - 1  (0) 2015.06.08
EventHandler 와 EventHandler<TEventArgs> Delegate  (0) 2015.06.04
Event 와 Delegate  (0) 2015.06.01
posted by 따시쿵
2015. 6. 9. 16:35 C#

 

2. Func와 Action으로 더 간편하게 무명 함수 만드는 경우

 

익명 메서드와 무명 함수는 코드를 더 간결하게 만들어주는 요소들입니다. 하지만 이들을 선언하기 전에 해야 하는 일들을 생긱해 보면 익명 메소드를 만들기위해서 매번 델리게이트를 선언합니다. 이 문제를 해결하기 위해 마이크로소프트는 Func와 Action 델리게이트를 미리 선언해 두었습니다.Func 델리게이트는 결과를 반환하는 메소드를 참조하기 위해, Action 델리게이트는 결과를 반환하지 않는 메소드를 참조합니다.

 

 

2. Action 델리게이트

 

시스템이 입력 파라미터가 17개인 델리게이트를 미리 정의해 두었습니다. 

 

Action<T> 델리게이트

 

매개 변수가 하나이고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화 합니다.

 

 

구문

 

public delegate TResult Func<in T, out TResult>(
     T arg
)


형식 매개 변수

 

in T
      이 대리자로 캡슐화되는 메서드의 매개 변수 형식입니다.
      이 형식 매개 변수는 반공변입니다.

      즉, 지정한 형식이나 더 적게 파생되는 모든 형식을 사용할 수 있습니다.

 

설명

 

Action<T> 델리게이트를 사용하면 사용자 지정 대리자를 명시적으로 선언하지 않고도 메서드를 매개 변수로 전달할 수 있습니다.

 

캡슐화된 메서드는 이 대리자에 의해 정의되는 메서드 시그니처(파리미터 타입과 갯수)와 일치해야 합니다.

즉, 캡슐화된 메서드에는 값으로 전달되는 매개 변수 하나가 있어야 하고 값을 반환하지 않아야 합니다.

 

C#의 경우 이 메서드는 void를 반환해야 합니다. 무시되는 값을 반환하는 메서드일 수도 있습니다. 일반적으로 이러한 메서드는 작업을 수행하는 데 사용됩니다.

 

 

예제1

 

Action<T> 델리게이트를 사용하는 경우에는 매개 변수가 하나인 메서드를 캡슐화하는 대리자를 명시적으로 정의할 필요가 없습니다.

 

예를 들어, 다음 코드에서는 DisplayMessage라는 델리게이트를 명시적으로 선언하고 WriteLine 메서드 또는 ShowWindowsMessage 메서드에 대한 참조를 해당 델리게이트 인스턴스에 할당합니다.

    delegate void DisplayMessage(string message);
    class Program
    {
        static void Main(string[] args)
        {
            DisplayMessage messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = ShowWindowMessage;
            else
                messageTarget = Console.WriteLine;

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }
    }

 

예제2

 

다음 예제에서는 새 델리게이트를 명시적으로 정의하고 명명된 메서드를 할당하는 대신 Action<T> 델리게이트를 인스턴스화하여 이 코드를 간소화합니다.

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = ShowWindowMessage;
            else
                messageTarget = Console.WriteLine;

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }

예제3

 

Action<T> 델리게이트를 anonymous method와 함께 사용할 수도 있습니다.

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = delegate(string s) { ShowWindowMessage(s); };
            else
                messageTarget = delegate(string s) { Console.WriteLine(s); };

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }

 

예제4

 

Action<T> 델리게이트 인스턴스에 람다 식을 할당할 수도 있습니다.

    class Program
    {
        static void Main(string[] args)
        {
            Action<string> messageTarget;

            if (Environment.GetCommandLineArgs().Length > 1)
                messageTarget = (string s) => { ShowWindowMessage(s); };
            else
                messageTarget = (string s) => { Console.WriteLine(s); };

            messageTarget("Hi, Korea world !!!");

            Console.ReadLine();
        }

        static void ShowWindowMessage(string message)
        {
            MessageBox.Show(message);
        }

 

 

실행화면은 아래와 같이 두 가지 화면이 동일하게 나옵니다. 

 

 

 

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

람다식(Lambda Expression) - 4  (0) 2015.06.11
람다식(Lambda Expression) - 2  (0) 2015.06.09
람다식(Lambda Expression) - 1  (0) 2015.06.08
EventHandler 와 EventHandler<TEventArgs> Delegate  (0) 2015.06.04
Event 와 Delegate  (0) 2015.06.01
posted by 따시쿵
2015. 6. 9. 11:04 C#

 

2. Func와 Action으로 더 간편하게 무명 함수 만드는 경우

 

익명 메서드와 무명 함수는 코드를 더 간결하게 만들어주는 요소들입니다. 하지만 이들을 선언하기 전에 해야 하는 일들을 생긱해 보면 익명 메소드를 만들기위해서 매번 델리게이트를 선언합니다. 이 문제를 해결하기 위해 마이크로소프트는 Func와 Action 델리게이트를 미리 선언해 두었습니다.Func 델리게이트는 결과를 반환하는 메소드를 참조하기 위해, Action 델리게이트는 결과를 반환하지 않는 메소드를 참조합니다.

 

 

1. Func 델리게이트

 

.Net 프레임워크에서는 모두 17가지의 Func 델리게이트가 미리 준비되어 있습니다.

입력 파라미터는 최대 16개까지 사용 가능합니다.

 

 

Func<T, TResult> 델리게이트

 

 

구문

 

public delegate TResult Func<in T, out TResult>(
 T arg
)

 

형식 매개 변수

 

in T

 

     이 대리자로 캡슐화되는 메서드의 매개 변수 형식입니다.

     이 형식 매개 변수는 반공변입니다.

     즉, 지정한 형식이나 더 적게 파생되는 모든 형식을 사용할 수 있습니다.

 

out TResult

 

     이 대리자로 캡슐화되는 메서드의 반환 값 형식입니다.

     이 형식 매개 변수는 공변입니다.

     즉, 지정한 형식이나 더 많이 파생되는 모든 형식을 사용할 수 있습니다.

 

 

매개 변수

 

arg
      형식: T
      이 대리자로 캡슐화되는 메서드의 매개 변수입니다.

 

반환 값
     형식: TResult
     이 대리자로 캡슐화되는 메서드의 반환 값입니다.

 


설명

 

1. 이 대리자를 사용하면 사용자 지정 대리자를 명시적으로 선언하지 않고 매개 변수로 전달할 수 있는 메서드를 나타낼 수 있습니다.

 

2. 캡슐화된 메서드는 이 델리게이트에 의해 정의되는 메서드 시그니처(파라미터 타입과 갯수)와 일치해야 합니다. 즉, 캡슐화된 메서드에는 값으로 전달되는 매개 변수 하나가 있어야 하고 값을 반환해야 합니다.

 

 

예제1

 

ConvertMethod라는 델리게이트를 명시적으로 선언하고 UppercaseString 메서드에 대한 참조를 해당 델리게이트 인스턴스에 할당합니다.

    delegate string ConvertMethod(string inString);
    class Program
    {
        static void Main(string[] args)
        {
            ConvertMethod convertMeth = UppercaseString;
            string name = "Korea Forever !!!!";

            Console.WriteLine("Before convert string : {0}", name);
            Console.WriteLine("After convert string : {0}", convertMeth(name));

            Console.ReadLine();
        }

        static string  UppercaseString(string inputString)
        {
            return inputString.ToUpper();
        }
    }

 

에제2

 

다음 예제에서는 새 델리게이트를 명시적으로 정의하고 명명된 메서드를 할당하는 대신 Func<T, TResult> 델리게이트를 인스턴스화하여 이 코드를 간소화합니다.

        static void Main(string[] args)
        {
            Func<string, string> convertMethod = UppercaseString;
            string name = "Korea Forever !!!";

            Console.WriteLine("Before convert string : {0}", name);
            Console.WriteLine("After convert string : {0}", convertMethod(name));

            Console.ReadLine();
        }

        static string UppercaseString(string inputString)
        {
            return inputString.ToUpper();
        }

 

예제3

 

C#에서는 다음 예제와 같이 Func<T, TResult> 델리게이트를 anonymous method와 함께 사용할 수도 있습니다.

        static void Main(string[] args)
        {
            Func<string, string> convert = delegate(string s)
            {
                return s.ToUpper();
            };

            string name = "Korea Forever !!!";

            Console.WriteLine("Before convert string : {0}", name);
            Console.WriteLine("After convert string : {0}", convert(name));

            Console.ReadLine();
        }

 

예제4

 

다음 예제와 같이 Func<T, TResult> 델리게이트에 람다식을 할당할 수도 있습니다.

            Func<string, string> convert = (string s) => s.ToUpper();

            string name = "Korea Forever !!!";

            Console.WriteLine("Before convert string : {0}", name);
            Console.WriteLine("After convert string : {0}", convert(name));

            Console.ReadLine();

 

4개 예제에 대한 동일한 결과화면 입니다.

 

 

 

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

람다식(Lambda Expression) - 4  (0) 2015.06.11
람다식(Lambda Expression) - 3  (0) 2015.06.09
람다식(Lambda Expression) - 1  (0) 2015.06.08
EventHandler 와 EventHandler<TEventArgs> Delegate  (0) 2015.06.04
Event 와 Delegate  (0) 2015.06.01
posted by 따시쿵
2015. 6. 8. 17:22 C#

람다식을 사용하는 이유와 목적을 먼저 살펴 보는게 순서일 듯 싶네요.

 

  • 익명 메소드를 만드는 경우
  • Func와 Action으로 더 간편하게 무명 함수 만드는 경우
  • LINQ를 이용한 방법으로 표현하는 경우
1. 익명 메소드(Anonymous method)를 만드는 경우

 

익명 메소드를 만드는 경우에는 delegate를 이용한 방법도 있습니다. 그런데 람다식을 이용한 방법도 제공하는 이유는 개발 히스토리에 해답이 있습니다.

 

마이크로소프트는 C# 2.0 에서 델리게이트를 이용한 익명 메소드를 만드는 방법을 제공했고, 람다식은 C# 3.0 에서 와서야 도입 되었습니다. 따라서 C# 2.0 에서 작성한 프로그램을 C# 3.0 에서 기능을 삭제할 수는 없는 일입니다.

 

식 형식

 

매개 변수 목록 => 식

 

문 형식

 

(매개 변수 목록) => {

                             ..........................

                             ..........................

                             ..........................

                           };

 

 

 

예제1 : 식 형식의 람다식 표현 

        delegate int Calculate(int a, int b);

        static void Main(string[] args)
        {
            // 1. 람다식을 이용한 표현(매개변수 타입 있는 경우)
            Calculate cal1 = (int a, int b) => a + b;
            Console.WriteLine("Lambda Expression : {0} + {1} = {2}", 4, 5, cal1(4, 5));

            // 2. 람다식을 이용한 표현(매개변수 타입 없는 경우)
            Calculate cal2 = (a, b) => a + b;
            Console.WriteLine("Lambda Expression : {0} + {1} = {2}", 4, 5, cal2(4, 5));

            // 3. 델리게이트를 이용한 표현
            Calculate cal3 = delegate(int a, int b) { return a + b; };
            Console.WriteLine("Delegate : {0} + {1} = {2}", 4, 5, cal3(4,5));

            Console.ReadLine();
        }

 

 

 

 

예제 2: 문 형식의 람다식

 

식 형식의 람다식에서는 반환 형식이 없는 무명 함수를 만들 수 없지만, 문 형식의 람다식을 이용하면 가능합니다.

        delegate void DoSomething();
        static void Main(string[] args)
        {
            DoSomething DoIt = () =>
            {
                Console.WriteLine("여기는 ");
                Console.WriteLine("대한민국 ");
                Console.WriteLine("입니다");
            };

            DoIt();

            Console.ReadLine();
        }

 

 

 

 

 

예제3 : 람다식이 익명 메소드를 대치하는 경우. 파라미터가 생략되는 경우가 있습니다.

 

 

button control 의 Click 이벤트는 EventHandler 델리게이트이며, 두 개의 파라미터를 가집니다. object sender, EventArgs e. 파라미터가 익명 메소드 안에서 사용하지 않는 경우에는 생략하는 경우도 있습니다.

        private void Form1_Load(object sender, EventArgs e)
        {
            Button button1 = new Button();
            button1.Text = "Click me !!!";

            // 1. 델리게이트 이용 & 파라미터를 생략한 경우
            button1.Click += delegate
            {
                MessageBox.Show("Button1 Clicked!");
            };

            // 2. 델리게이트 이용 & 파라미터가 있는 경우
            button1.Click += delegate(object eventSender, EventArgs eventArgs)
            {
                MessageBox.Show("Button1 Clicked!");
            };

            // 3. 람다식을 이용한 식으로 표현함
            button1.Click += (object eventSender, EventArgs eventArgs) => MessageBox.Show("Button1 Clicked!");

            // 4. 람다식을 이용한 문으로 표현함
            button1.Click += (object eventSender, EventArgs eventArgs) => { MessageBox.Show("Button1 Clicked!"); };

            // 5. 람다식 이용 & 파라미터 타입 생략하는 경우
            button1.Click += (eventSender, eventArgs) => { MessageBox.Show("Button1 Clicked!"); };

            this.Controls.Add(button1);
        }

 

 

 

 

 

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

람다식(Lambda Expression) - 3  (0) 2015.06.09
람다식(Lambda Expression) - 2  (0) 2015.06.09
EventHandler 와 EventHandler<TEventArgs> Delegate  (0) 2015.06.04
Event 와 Delegate  (0) 2015.06.01
초단위 시간 경과 보이기  (0) 2015.05.12
posted by 따시쿵
prev 1 next