본문 바로가기

Programming/C#

C# Anonymous Method

Anonymous Method(무명 메서드)

개요

  • 무명메서드를 하기위해서는 Delegate를 알아야 할 필요가 있다.

1.Delegate

  • 메서드를 참조하는 변수이다. 델리게이트는 메서드를 대신해서 호출하는 역할을 한다. 
  • 하나의 Delegate로 여러 메서드를 호출할 수 있다

public delegate int CalDelegate(int a, int b); //델리게이트 선언
 
public class Anonymous
{
    // 델리게이트로 덧셈할 메서드
    public int Plus(int operandA, int operandB)
    {
        return operandA + operandB;
    }
    // 뺄셈할 메서드
    public int Minus(int operandA, int operandB)
    {
        return operandA - operandB;
    }
}
 
[TestClass]
public class AnonymousTest
{
    [TestMethod]
    public void AnonymousTest()
    {
        // 테스트 코드 선언부
                     // operandA, operandB와 덧셈, 뺄셈 결과값
        int plusResult = 13; 
        int minusResult = 5;
        int operandA= 9, operandB = 4;
 
        // 클래스 객체 델리게이트 객체 생성
        Anonymous anonymous = new Anonymous();
        CalDelegate plus = new CalDelegate(anonymous.Plus);
        CalDelegate minus = new CalDelegate(anonymous.Minus);
 
        // 결과
        Assert.AreEqual(plusResult, plus(operandA, operandB));
        Assert.AreEqual(minusResult, minus(operandA, operandB));
    }
}

  • 사실 이와 같이 델리게이트를 쓰는 것은 큰 의미가 없다. 메소드를 직접 호출하면 되기 때문이다. 델리게이트의 진정한 가치는 “콜백메서드”를 구현할 때에 나타난다.

2. Callback Method

  • Callback은 A라는 메서드를 호출할 때에 B라는 메서드를 넘겨주어 A메서드로 하여금 B메서드를 호출하도록 하는 것을 말한다.

//델리게이트 선언
public delegate int CalDelegate(int operandA, int operandB);
 
public class Anonymous
{
    // 콜백할 메서드 추가
    public int Calcul(int operandA, int operandB, calDelegate del)
    {
        return del(operandA, operandB)
    }
   
    // 델리게이트로 덧셈할 메서드
    public int Plus(int operandA, int operandB)
    {
        return operandA + operandB
    }
   
    // 델리게이트로 뺄셈할 메서드
    public int Minus(int operandA, int operandB
    {
        return operandA - operandB
    }
}
 
[TestClass]
public class AnonymousTest
{
    [TestMethod]
    public void AnonymousTest()
    {
        // 테스트 코드 선언부
                     // operandA, operandB와 덧셈, 뺄셈 결과값
        int plusResult = 13; 
        int minusResult = 5;
        int operandA= 9, operandB = 4;
 
        // 클래스 객체 델리게이트 객체 생성
        Anonymous anonymous = new Anonymous();
        CalDelegate plus = new CalDelegate(anonymous.Plus);
        CalDelegate minus = new CalDelegate(anonymous.Minus);
 
        // 결과
        Assert.AreEqual(plusResult, anonymous.CalCulator(operandA, operandB, plus));
        Assert.AreEqual(minusResult, anonymous.CalCulator(operandA, operandB, minus));
    }
}

3. Anonymous Method

  • 모든 메서드는 이름을 가진다. 하지만 C#에는 이름이 없는 무명 메서드를 제공한다. 무명메서드는 이름이 없기 때문에 델리게이트 변수를 사용한다.
  • 문법이 직관적이게 되서 가독성이 높아진다.

//델리게이트 선언
public delegate int CalDelegate(int operandA, int operandB);
 
public class Anonymous
{
    // 콜백할 메서드 추가
    public int CalCulator(int operandA, int operandB, CalDelegate del)
    {
        return del(operandA, operandB);
    }  
}
 
[TestClass]
public class AnonymousTest
{
    [TestMethod]
    public void AnonymousTest()
    {
        // 테스트 코드 선언부
        int plusResult = 13; // a+b 덧셈값
        int minusResult = 5; // a-b 뺄셈값
        int operandA= 9, operandB = 4;
 
        // 클래스 객체 델리게이트 객체 생성
        Anonymous anonymous = new Anonymous();
 
                     // 더하기 빼기 무명 메서드
        CalDelegate An_plus = delegate(int deleOperandA, int deleOperandB)
           {
                   return operandA + operandB;
           };
        CalDelegate An_minus = delegate(int deleOperandA, int deleOperandB)
           {
                     return operandA - operandB;
           };
 
        // 결과
        Assert.AreEqual(plusResult, anonymous.CalCulator(a, b, An_plus));
        Assert.AreEqual(minusResult, anonymous.CalCulator(a, b, An_minus));
    }
}

  • 테스트코드에서 무명메서드를 이용하여 class1의 코드수가 많이 줄었음을 볼 수 있다. 

'Programming > C#' 카테고리의 다른 글

C# Yield  (0) 2016.02.25
C# Partial Type  (0) 2016.02.18
C# NullType  (0) 2016.02.18
C# Generic  (0) 2016.02.18
C# -기초-  (0) 2016.02.09