26 무명 메서드

vencott·2021년 6월 2일
0

C#

목록 보기
26/32

C# 2.0부터 메서드를 미리 정의하지 않아도 되는, 메서드명이 없는 무명 메서드(익명 메서드, Anonymous Method)를 지원

어떤 메서드가 일회용으로 단순하게 쓰인다면, 굳이 별도로 메서드를 정의하지 않아도 된다

무명 메서드를 만들기 위해선 delegate 키워드와 함께 파라미터와 실행 문장 블록을 적는다

// 무명메서드 형식: delegate(파라미터들) { 실행문장들 };
delegate(int param1) { Console.Write(param1); };

// 무명메서드를 delegate 타입 변수에 할당

delegate void MyDelegate(int a);

MyDelegate d = delegate(int p) 
{ 
   Console.Write(p); 
};

d(100);

무명 메서드의 사용

메서드가 필요한 곳에 직접 delegate로 시작하는 무명 메서드를 써준다

  • 델리게이트 변수에 할당해서 사용
  • 메서드의 파라미터에 인라인 형식으로 사용
  • 이벤트 핸들러를 추가하는 곳에 사용
public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();

      // 메서드명을 지정
      this.button1.Click += new System.EventHandler(this.button1_Click);

      // 무명메서드를 지정
      this.button2.Click += delegate(object s, EventArgs e)
      {
         MessageBox.Show("버튼2 클릭");
      };
   }

   private void button1_Click(object sender, EventArgs e)
   {
      MessageBox.Show("버튼1 클릭");
   }
}

델리게이트 vs 무명 메서드 (1)

delegate 키워드는 델리게이트 타입을 정의할 때도 사용되고, 무명메서드를 정의할 때도 사용된다

델리게이트 타입을 정의하는 경우, new를 사용하여 Delegate 객체를 생성하고 이 객체에 특정 메서드를 연관시켜 할당한다

public delegate int SumDelegate(int a, int b);
                      
SumDelegate sumDel = new SumDelegate(mySum);

무명메서드는 이름이 없는 메서드 자체만을 가리킬 뿐 그 자체로 Delegate 타입이 되는 것은 아니다

따라서 EventHandler 델리게이트 객체를 new로 생성하고 무명메서드를 파라미터로 전달한다

button1.Click += new EventHandler(delegate(object s, EventArgs a) { MessageBox.Show("OK"); });

하지만 Event와 같이 이미 어떤 델리게이트 타입이 사용될 지 아는 경우, new EventHandler()
(EventHandler) 캐스팅을 생략할 수 있다

button1.Click += (EventHandler) delegate(object s, EventArgs a) { MessageBox.Show("OK"); };

button1.Click += delegate(object s, EventArgs a) { MessageBox.Show("OK"); };

만약 파라미터를 무명메서드 안에서 사용하지 않는다면, 파라미터들을 완전히 삭제할 수도 있다

button1.Click += delegate { MessageBox.Show("OK"); };

델리게이트 vs 무명 메서드 (2)

델리게이트 타입을 사용해야 하는 곳에 무명 메서드만 직접 사용하는 경우 컴파일 에러가 발생할 수 있다

Control.Invoke() 메서드는 델리게이트 타입을 파라미터로 받아들이는데 해당 Delegate의 파라미터가 몇 개인지, 리턴 값은 무엇인지 미리 알지 못한다

따라서 무명메서드를 무조건 전달할 수 없고, 어떤 Delegate 타입인지를 명시적으로 지정해야한다

// 틀림: 컴파일 에러 발생
this.Invoke(delegate {button1.Text = s;} );

// 맞는 표현 
MethodInvoker mi = new MethodInvoker(delegate() { button1.Text = s; });
this.Invoke(mi);

// 축약된 표현
this.Invoke((MethodInvoker) delegate { button1.Text = s; });

/* 
MethodInvoker는 입력 파라미터가 없고, 리턴 타입이 void인 델리게이트이다.
MethodInvoker는 System.Windows.Forms 에 다음과 같이 정의되어 있다.

public delegate void MethodInvoker();
*/

출처: http://www.csharpstudy.com/

profile
Backend Developer

0개의 댓글