개발 기록/C#

[C#] delegate vs 무명 delegate, lamba 란?

Ratataca 2021. 11. 22. 09:42

Delegate란?

특정 형태의 메서드를 매개변수로 전달하는 의미

 

 

deldgate를 매개변수로 받아들이는 Count 메서드

1. Judgement의 이름만 정의함

 

2. Judge 매서드를 선언하고 선언한 곳

 

using System;

namespace _20211122
{

    class Step3
    {

        public delegate bool Judgement(int value);

        public int Count(int[] numbers, Judgement judge)
        {
            int count = 0;
            foreach(var n in numbers)
            {
                if(judge() == true)
                    count++;
            }
            return count;
        }

        public void Do()
        {
            var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };

            Judgement judge = IsEven;
            var count = Count(numbers, judge);
            Console.WriteLine("result: " + count);
        }

        public bool IsEven(int n)
        {
            return n % 2 == 0;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Step3 myStep = new Step3();
            myStep.Do();
            Console.WriteLine("Hello World!");
        }

    }
}

 

과제

delegate와 lamba 조사

 

 - delegate

delegate는 매개변수로 함수를 전달하는 키워드이다. 각각의 함수의 기능을 최대한 나눠서 같은 함수내 delegate를 사용하여 다른 로직 처리가 가능하다는 것이다. 우리는 이를 통해 기능 단위별로 함수를 세분화하여 나눌 수 있고 중복되는 코드를 줄일수 있게 된다. 

 

 - Predicate는 델리게이트의 제너릭 버전, &&  무명 delegate

predicate : judgement와 같은 델리게이트를 정의할 필요가 없다

무명 : 매서드의 이름을 빼고, 실제 내용만 넣겠다.

class Step4 {
        public int Count(int[] numbers, Predicate<int> judge)
        {
            int count = 0;
            foreach(var n in numbers)
            {
                if(judge(n) == true)
                    count++;
            }
            return count;
        }

        public void Do()
        {
            var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };

            var count = Count(numbers, delegate (int n) { return n % 2 == 0; } );
            Console.WriteLine("result: " + count);
        }

        public bool IsEven(int n)
        {
            return n % 2 == 0;
        }

    }

 

 

 - lamba

delegate 키워드 대신에 => (람다연산자) 사용,

형식!

매래변수 => 함수 내부

궁금증?

Q : judge의 대해서 return 타입을 정하지 않아도 되나요?

A : Yes, 컴파일이 알아서 판단

결과적으로 이렇게도 사용 가능

 

 

 class Step5
    {
        public int Count(int[] numbers, Predicate<int> judge)
        {
            int count = 0;
            foreach(var n in numbers)
            {
                if(judge(n) == true)
                    count++;
            }
            return count;
        }

        public void Do()
        {
            var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };

            Predicate<int> judge = (int n) =>
            {
                if(n % 2 == 0)
                    return true;
                else
                    return false;
            };
            var count = Count(numbers, judge);
            Console.WriteLine("result: " + count);
        }

    }

 

 

judge 변수를 사용하지 않고 더 간단하게 lamba를 이용해보자

    class Step6
    {
        public int Count(int[] numbers, Predicate<int> judge)
        {
            int count = 0;
            foreach(var n in numbers)
            {
                if(judge(n) == true)
                    count++;
            }
            return count;
        }


        public void Do()
        {
            var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };

            var count = Count(
                numbers,
                (int n) =>
                {
                    if(n % 2 == 0)
                        return true;
                    else
                        return false;
                }
                );

            Console.WriteLine("result: " + count);
        }

    }