C#프로그래밍 20 : 람다식, 전용대리자(Func, Action), 식 본문 멤버

LeeWonjin·2022년 6월 2일
0

[학부]C#프로그래밍

목록 보기
20/21

람다식

대리자를 선언한 뒤, 이 대리자 형식의 참조에 람다식을 대입하여 사용할 수 있다.
람다식으로 생성한 익명메소드는 무명함수라고 부른다.

class Program
    {
        delegate int Delg(int x, int y);

        static void Main(string[] args)
        {
            // delegate 키워드를 사용한 익명메소드
            Delg subtract = delegate (int a, int b) { return a - b; };
            Console.WriteLine(subtract(5, 3)); // 2

            // 람다식을 사용한 익명메소드
            Delg multiply = (int a, int b) => a * b;
            Delg add = (a, b) => a + b; // 매개변수 자료형 생략 가능 (대리자 선언으로부터 유추됨)

            Console.WriteLine(multiply(2, 3)); // 6
            Console.WriteLine(add(5, 3)); // 8

            // 문 형태의 람다식
            Delg divide = (a, b) =>
            {
                int result = 0;
                result = a / b;
                return result;
            };
            Console.WriteLine(divide(9, 3)); // 3
        }
    }

전용 대리자

입력 매개변수 갯수가 0~16개인 대리자.
익명메소드 (무명함수)를 간편하게 만들기 위해 존재함.

Func 대리자

리턴값이 있는 익명메소드를 참조하기 위해 .NET에서 사전정의한 대리자.
https://docs.microsoft.com/ko-kr/dotnet/api/system.func-2?view=net-6.0

static void Main(string[] args)
{
    Func<string> gorani = () => "gorani"; // 인수 없고 string 반환
    Func<int, string> goraniWithNum = (a) => $"gorani_{a}"; // 인수 int형 1개, 반환형 string
    Func<int, int, int> add = (a, b) => a + b; // 인수 int형 2개, 반환형 int

    Console.WriteLine(gorani()); // gorani
    Console.WriteLine(goraniWithNum(53)); // gorani_53
    Console.WriteLine(add(5, 3)); // 8
}

Action 대리자

리턴값이 없는 익명메소드를 참조하기 위해 .NET에서 사전정의한 대리자

class Program
{
    static void Main(string[] args)
    {
        Action printGorani = () => Console.WriteLine("Gorani"); // 인수 없음
        printGorani(); // Gorani

        Action<string, string> concatStr = (a, b) => Console.WriteLine(a + b);
        concatStr("55", "33"); // 5533
            
        Action<int, int> add = (a, b) =>
        {
            int result = a + b;
            Console.WriteLine(result);
        };
        add(5, 3); // 8
    }
}

식 본문 멤버

메소드, 프로퍼티, 인덱서, 생성자, 종료자를 람다식의 형태로 표현한 것
(문은 안됨)

namespace Program
{
    class Gorani
    {
        private string name = "goranigorani";
        public List<string> Friends = new List<string>();
           
        // 프로퍼티
        public string Name
        {
            get => name;
            set => name = value;
        }

        // 인덱서
        public string this[int idx]
        {
            get => Friends[idx];
            set => Friends[idx] = value;
        }

        // 생성자 종료자
        public Gorani() => Console.WriteLine("생성자 호출");
        ~Gorani() => Console.WriteLine("종료자 호출");

        // 메소드
        public void AddFriend(string name) => Friends.Add(name);
        public void RemoveFriend(string name) => Friends.Remove(name);
    }

    class Program
    {
        static void Main(string[] args)
        {
            Gorani gorani = new Gorani();
            gorani.Name = "wonjin";
            Console.WriteLine(gorani.Name);

            gorani.AddFriend("one");
            gorani.AddFriend("two");
            foreach(var friend in gorani.Friends)
            {
                Console.Write($"{friend} ");
            }
            Console.WriteLine();

            gorani.RemoveFriend("one");
            foreach (var friend in gorani.Friends)
            {
                Console.Write($"{friend} ");
            }
        }
    }
}
profile
노는게 제일 좋습니다.

0개의 댓글