프로그래밍/C#

[C#] Delegate (2)

갓똥 2020. 4. 4. 18:33
728x90
반응형

1. Delegate에 메소드를 등록하는 방법

using System;

delegate void FUNC(int arg);

class Test {
    public static void static_method(int arg) { }
    public void instance_method(int arg) { }
}

class Program {
    public static void static_method(int arg) { }
    public void instance_method(int arg) { }
    
    public static void Main() {
        FUNC f1 = Test.static_method;
        
        // FUNC f2 = Program.static_method; // ok
        FUNC f2 = static_method;            // ok
        
        Test t = new Test();
        FUNC f3 = t.instance_method;
        
        Program p = new Program();
        FUNC f4 = p.instance_method;
        
        p.foo();
    }
    
    public void foo() {
        FUNC f1 = this.instance_method;
        FUNC f2 = instance_method;
    }
}

 

Test 클래스안에 스태틱과 인스턴스 메소드가 있고
내 자신안에 스태틱과 인스턴스 메소드가 있다.
이제 Delegate를 이용하여 메소드의 정보를 담아볼건데
먼저 스태틱 메소드 같은 경우 객체가 없어도 클래스 이름만으로 호출할 수 있다.
그래서 15번째 라인과 같이 쓸 수 있다.
마찬가지로 내 자신안의 스태틱도 17~18번째 라인과 같이 쓸 수 있다.
앞에 클래스 이름인 Program은 써도 되고 안써도 된다.

반면 instance method는 객체가 필요하므로 객체 생성 후 사용하면 된다.

이번엔 위의 상태 그대로 foo함수를 호출해보자.
foo함수 같은 경우 이미 객체가 만들어진 상태이므로 this를 통해 호출 가능하다.
this가 없어도 상관없다.

 ① static method

    => 클래스 이름.메소드 이름

    => 자신의 메소드인 경우 클래스 이름은 생략가능

 

 ② instance method

    => 객체.메소드 이름

 

 


2. 익명 메소드 (Anonymous Method)

using System;

delegate int FUNC(int arg1, int arg2);

class Program {
    public static int Add(int a, int b) { return a + b; }
    
    public static void Main() {
        FUNC f = Add;
        
        Console.WriteLine(f(1, 2));
    }
}

 

Add라는 메소드가 있고 Main에서 사용중이다.
근데 Add가 위와 같이 한 번만 사용되고 다른 곳에서 쓸 일이 없다면
아래와 같이 만들 수 있다.
using System;

delegate int FUNC(int arg1, int arg2);

class Program {    
    public static void Main() {
        FUNC f = delegate(int a, int b) { return a + b };
        
        Console.WriteLine(f(1, 2));
    }
}

 

위의 코드 2개는 같은 기능을 하는 코드이다.
Add와 같은 기능을 하는데 이름이 없다. 이런 것을 익명의 메소드라고 한다.
가끔 사용하는데 가령 아래와 같은 상황에서 쓸 수 있다.
using System;

delegate int FUNC(int arg1, int arg2);

class Program {
    public static int Add(int a, int b) { return a + b; }
    
    public static void Main() {
        FUNC f = Add;
        
        Console.WriteLine(f(1, 2));
        
        Foo(Add);
        Foo(delegate(int a, int b) { return a - b });
    }
    
    public static void Foo(FUNC f) {
    }
}

 

17번째 라인의 Foo는 Delegate를 인자로 받는다.
그래서 13번째 라인과 같이 Add를 보낼 수 있는데 
더하는게 아닌 뺄셈이 필요하다고 할 때 특히 뺄셈은 한 번쓰고 말거라고 할 때
14번째 라인과 같이 보낼 수 있다. (메소드를 하나 더 만들 필요가 없게 됨)
728x90
반응형