본문 바로가기
개발 기록/C#

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

by Ratataca 2021. 11. 22.

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);
        }

    }

댓글