C# - 람다식(Lambda), Action & Func) 복습을 위해 작성하는 글 2023-04-20

rizz·2023년 4월 20일
0

C

목록 보기
6/25

📒 갈무리 - 람다식(Lambda), Action & Func

📌 람다식이란?

- 익명 메소드를 의미한다.

- 메소드와 동일하게 파라미터와 리턴이 존재한다.

- 파라미터 타입을 명시해도 되고, 하지 않아도 된다.

- return을 명시해도 되고, 하지 않아도 되지만 명시할 것이라면 {}로 감싸주어야 한다.

- 리스트 함수 중 delegate 파라미터로 활용된다.

- Collections에서 다양하게 활용된다.

// C#

// 람다식을 활용하여 delegate에 메서드 참조
delegate int CountDelegate(int number);
CountDelegate count = (number) => { return number + number; };

📌 delegate의 람다식 활용

// C#

            List<int> dataList = new List<int> { 1, 2, 3, 4, 5 };

            // List의 FindAll 함수를 직접 찾아가 보면 매개변수로 bool형을 리턴하는 delegate를 받게 되어있다.
            List<int> findAllList = dataList.FindAll((num) => { return num < 3; }); // return을 명시할 땐 {}를 사용

            Console.WriteLine("3보다 작은 수");
            foreach (var number in findAllList)
            {
                Console.WriteLine(number);
            }

            int findNum = dataList.Find((num) => num % 2 == 0); // return을 명시하지 않을 땐 {}를 사용하지 않음
            Console.WriteLine("짝수 : " + findNum);
            
Output:
3보다 작은 수
1
2
짝수 : 2

📌 함수의 람다식 활용

// C#
    delegate void printDelegate(string message);
    delegate void funcDeleaget();
    class Program
    {
        public static void Call(string message)
        {
            Console.WriteLine(message);
        }

        public static void CallBack(printDelegate dp, string message)
        {
            if (dp != null)
            {
                dp("Call Back : " + message);
            }
        }
        static void Main(string[] args)
        {
            CallBack(Call, "Hello 1"); // 미리 구현된 메서드를 참조

            // delegate로 익명 메소드를 구현하여 참조시킴
            CallBack(delegate (string message) { Console.WriteLine(message); }, "Hello 2");

            // 람다식으로 메소드를 구현하여 참조시킴
            // 파라미터 타입 생략 가능
            CallBack((string message) => Console.WriteLine(message), "Hello 3");

            // 파라미터가 있는 경우에는 ()를 생략할 수 있지만, 파라미터가 없는 경우에는 ()를 생략할 수 없다.
            CallBack(message => Console.WriteLine(message), "Hello 4");
            funcDeleaget fd = () => Console.WriteLine("Hello 5");
        }
    }

 

📌 Action

- 리턴값이 없는 delegate를 미리 선언해 둔 것

- 파라미터를 최대 16개까지 받을 수 있는 Action들이 구현되어 있다.

// C#
        static void CallAction()
        {
            Console.WriteLine("CallAction");
        }
        static void Main(string[] args)
        {
            Action func1;
            Action<int> func2;
            Action<float, int> func3;

            func1 = CallAction;
            func2 = (num) => Console.WriteLine("num : " + num);
            func3 = (a, b) =>
            {
                float result = b / a;
                Console.WriteLine($"a : {a}, b : {b}, result : {result}");
            };

            func1();
            func2(100);
            func3(6.0f, 10);
        }

 

📌 Func

- 리턴값이 있는 delegate를 미리 선언해 둔 것

- <>안에 마지막 타입이 리턴 타입이 된다.

// C#
        static int CallFunc()
        {
            return 100;
        }
        static void Main(string[] args)
        {
            // <>안에 마지막 타입이 리턴 타입이 된다.
            Func<int> func1;
            Func<int, float> func2;
            Func<int, int, int> func3;

            func1 = CallFunc;
            func2 = number => (float)(number / 2.0f);
            func3 = (a, b) => a + b;

            Console.WriteLine("func1 : "+ func1());
            Console.WriteLine("func2 : "+ func2(10));
            Console.WriteLine("func3 : "+ func3(100, 150));
        }

 

💡 TIP

delegate를 통해서 작업을 할 때, 사용하려는 형태의 Action이나 Func가 있는지 고민해 보자.

profile
복습하기 위해 쓰는 글

0개의 댓글

관련 채용 정보