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
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Delegate Chain (0) | 2020.04.07 |
---|---|
[C#] Delegate Example (0) | 2020.04.06 |
[C#] Delegate (1) (0) | 2020.03.30 |
[C#] 제너릭 제약 (Generic Constraint) (0) | 2020.03.27 |
[C#] 제너릭 (Generic) (0) | 2020.03.23 |