728x90
반응형
1. 핵심 정리
using System;
delegate void FUNC(int arg);
class Program {
static void Main() {
int n = 10;
double d = 3.4;
string s = "hello";
// ? f = foo;
FUNC f = foo;
}
public static void foo(int arg) {
Console.WriteLine($"foo : {arg}");
}
}
정수형 데이터 타입을 담는 int
실수형 데이터 타입을 담는 double
문자열 데이터 타입을 담는 string
그렇다면 11번째 라인과 같이 함수를 담는 데이터 타입을 무엇일까?
① Delegate
=> 메소드(메소드의 호출 정보, 메소드 모양/주소)를 저장하는 타입
=> ( ) 연산자 또는 invoke() 메소드를 사용해서 저장된 메소드를 호출할 수 있다.
=> C/C++의 함수 포인터 개념과 유사
2. Delegate를 만드는 방법
using System;
class Program {
static void Main() {
FUNC f = foo;
f(10);
}
public static void foo(int arg) {
Console.WriteLine($"foo : {arg}");
}
}
위의 코드에서 Delegate를 만든다고 해보자.
Main에서 foo함수의 정보를 담을 데이터 타입이 필요하다.
그래서 FUNC라는 데이터 타입을 만들어야한다. (타입의 이름은 상관없다)
만드려면 먼저 foo 함수에서 타입, 이름, 인자를 복사한다.
그리고 클래스 밖에 붙여 넣는다.
using System;
void foo(int arg); // foo는 메소드
class Program {
static void Main() {
FUNC f = foo;
f(10);
}
public static void foo(int arg) {
Console.WriteLine($"foo : {arg}");
}
}
위와 같으 형태가 되었다.
위의 형태는 함수의 모양이다.
delegate를 만드려면 앞에 delegate라고 적기만 하면 된다.
using System;
// void foo(int arg); // foo는 메소드
delegate void foo(int arg);
class Program {
static void Main() {
FUNC f = foo;
f(10);
}
public static void foo(int arg) {
Console.WriteLine($"foo : {arg}");
}
}
위의 형태로 foo타입을 만들었다.
foo는 타입이 되었고 이 타입은 void를 반환하고 인자가 int인 메소드를 받는다.
우리는 타입의 이름을 FUNC로 하기로 했으니 이름만 바꿔주면 된다.
using System;
// void foo(int arg); // foo는 메소드
delegate void FUNC(int arg); // FUNC는 타입
// 메소드의 호출정보를 담는 타입
class Program {
static void Main() {
FUNC f = foo;
f(10);
}
public static void foo(int arg) {
Console.WriteLine($"foo : {arg}");
}
}
① Delegate 만드는 방법
=> delegate 함수반환타입 Delegate이름(parameter list);
3. Delegate 원리
using System;
delegate void FUNC(int arg);
/*
class FUNC : System.MulticastDelegate {
// ...
}
*/
class Program {
static void Main() {
FUNC f = foo;
f(10);
}
public static void foo(int arg) {
Console.WriteLine($"foo : {arg}");
}
}
3번째 라인과 같이 Delegate를 만들게 되면
6~8라인과 같이 컴파일러가 클래스를 만들어준다.
해당 클래스는 Delegate의 모든 기능을 가지고 있는 System.MulticastDelegate를 상속 받으며
안에 Invoke와 같은 메소드가 있다.
그럼 클래스라면 생각해볼 내용이 있다.
원래 C#에서 클래스를 객체로 만드는 정확한 표기법은
FUNC f1 = new FUNC(foo); 이고 Invoke도
f1.Invoke(10); 과 같이 사용해야 한다. 문제는 없다.
하지만 위의 코드의 Main에서 쓴것과 같이 적어도 컴파일러가 알아서 처리해준다.
ⓛ FUNC는 메소드의 호출정보를 저장하는 타입
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Delegate Example (0) | 2020.04.06 |
---|---|
[C#] Delegate (2) (0) | 2020.04.04 |
[C#] 제너릭 제약 (Generic Constraint) (0) | 2020.03.27 |
[C#] 제너릭 (Generic) (0) | 2020.03.23 |
[C#] 인덱서 (Indexer) (0) | 2020.03.19 |