본문 바로가기

IT

[C#] delegate, anonymous delegate, lambda 용례비교


안녕하세요, 모스크바에서 생활하고 있는 개발자 윤진입니다.


C#에는 여러가지 흥미로운 기능이 많이 있습니다.

C는 포인터를 통해 함수를 변수처럼 이 함수, 저 함수로 전달할 수 있는데요,

C#에서도 delegate나 anonymous delegate, lambda 기능을 이용하여 메소드를 전달할 수 있습니다.


위의 방법들은 결국 메소드를 아규먼트로 전달하려는 목적으로 탄생했기에 큰 틀에서 보면 유사합니다.

1) 우선 전달하고자 하는 메소드의 원형을 선언합니다.

2) 그리고, 원형에 맞는 메소드(들)을 정의합니다.

3) 마지막으로 정의된 메소드를 아규먼트로 넣어 다른 메소드로 전달합니다.


- delegate

delegate를 선언하기 위해서는 일반 메소드처럼 선언하고 delegate 키워드만 앞에 추가하면 됩니다.

(곧, delegate <리턴타입> <이름>(<아규먼트>, ...)처럼 선언하면 됩니다)

아래 코드에서는 DelegateName이라고 delegate를 선언한 뒤,

DefinedMethod 메소드를 하나 정의한 후,

Main 함수 내에서 DefinedMethod를 대입하여 사용하고 있습니다.

    delegate void DelegateName(int variable);

    class Program
    {
        public static void DefinedMethod(int variable)
        {
            Console.WriteLine(variable);
        }

        static void Main(string[] args)
        { 
            DelegateName method = DefinedMethod;
            method(1);
        }
    }


- anonymous delegate

무명으로 delegate를 만들어서,

메소드의 이름을 짓는 번거로움에서 벗어날 수 있습니다.

delegate와 차이는 메소드 정의를 전달하는 위치에서 한다는 점입니다.

그렇기 때문에 method의 리턴타입과 이름을 생략하고 간단하게 정의할 수 있습니다.

    delegate void DelegateName(int variable);

    class Program
    {
        static void Main(string[] args)
        { 
            DelegateName method = delegate(int variable)
            {
                Console.WriteLine(variable);
            };
            method(1);
        }
    }


- lambda

lambda는 위의 anonymous delegate보다 간소하게 사용할 수 있습니다.

delegate 키워드 대신 보다 직관적인 '=>'를 사용합니다.

그리고 아규먼트의 타입 지시자도 생략할 수 있습니다.

    delegate void DelegateName(int variable);

    class Program
    {
        static void Main(string[] args)
        { 
            DelegateName method = (variable)=>
            {
                Console.WriteLine(variable);
            };
            method(1);
        }
    }


delegate나 lambda가 등장하여 closer variable와 같은 흥미진진한 변수도 등장하게 되는데요,

메모리 관리 측면은 차후에 다시 살펴보도록 하겠습니다.


끝_