아래는 delegate에 대한 기본적인 개념 소개와 간단한 예제를 통해 개념을 이해해 보고자 한다.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EXdelegate1
{
class Program
{
//delegate란
// (1) 일종의 데이터 type과 같다.
// (2) 어떤 메소드를 encapsulate할수 있다. 즉 어떤 메소드를 가리킬수 있고
// 이를 통해 그 메소드를 실행할수 있다.
// 이를 통해 그 메소드를 실행할수 있다.
// (3) similar to function pointer in C, C++
// (C, C++에서 어떤 함수를 포인터로 가리키고 이 포인터를 이용해서
// 해당 함수를 실행하는 방식)
//아래는 새로운 데이터 타입과 같은 delegate를 선언하는데 이 새로운 데이터 타입의
//이름은 Del이고
// 해당 함수를 실행하는 방식)
//아래는 새로운 데이터 타입과 같은 delegate를 선언하는데 이 새로운 데이터 타입의
//이름은 Del이고
//이 데이터 타입이 가리킬수 있는 메소드는 argument로 string을 하나 받고
//반환 값은 void인
//반환 값은 void인
//메소드가 있다면 그들 메소드들은 모두 delegate 이름이 Del인
//새로운 데이터 타입으로 객체를 선언하고
//새로운 데이터 타입으로 객체를 선언하고
//이 선언된 delegate 타입의 객체로 그들 메소드들을 실행할수 있다.
private delegate void Del(string message);
//아래는 새로운 데이터 타입인 MyDel이라는 이름의 데이터 타입을 선언하는데
//이 데이터 타입은
//이 데이터 타입은
//특별히 delegate형태의 데이터 타입이다.
//MyDel라는 데이터 타입으로 선언된 어떤 객체(참조변수)는 argument로 string 타입 하나,
//int 타입 하나를
//int 타입 하나를
//받고 반환 데이터는 string 타입을 반환하는 모든 메소드를 MyDel이라는
//데이터 타입으로 모두
//데이터 타입으로 모두
//가리키고 또 실행할수 있다는 개념이다.
private delegate string MyDel(string info, int some);
static void Main(string[] args)
{
//delegate 객체를 생성. 이 delegate 객체가 실행할 메소드는 DelegateMethod()이다.
//handler는 delegate Del 타입의 object이다
//delegate 타입의 객체 생성은 Java나 기존의 객체 생성 방식과 약간 다르다.
//Del이라는 delegate 타입의 객체 handler가 실행할 메소드 이름을 대입해 주면
//delegate Del 타입의 새로운 객체가 하나 생성된다.
Del handler = DelegateMethod;
//Del이라는 delegate 타입의 객체 handler가 실행할 메소드 이름을 대입해 주면
//delegate Del 타입의 새로운 객체가 하나 생성된다.
Del handler = DelegateMethod;
handler("delegate object가 보낸 메시지");
MyDel another = AnotherDelegateMethod;
Console.WriteLine("\n\n 이름 : " + another("홍길동", 25));
Del myDel = mDel;
myDel("Del이라는 이름의 delegate가 실행하는 두~~ 번째 메소드임");
//익명함수 방식으로 delegate 객체 생성
//익명함수란 원래 객체 생성 시점에 함수(메소드)의 이름은 없이 막바로 함수 본체가
//주어지면서 객체 생성되는 형태이다.
//따라서 아래에서 MyDel의 조건인 매개인자로 string 하나, int형 하나를 받고
//반환 데이터 타입이 string이라는 조건만 만족시켜주면 함수 본체는
//내용이 어떠하든지 상관이 없다.
MyDel anonymMyDel = delegate (string addr, int sex)
{
string gender = "";
if (sex == 1)
{
gender = "남성";
} else if (sex == 0)
{
gender = "여성";
}
return "주소 : " + addr + ", 성별 : " + gender;
};
Console.WriteLine(anonymMyDel("서울특별시 강남구 아무개길 77", 1));
//익명함수 방식의 delegate 객체 생성2
Del anonymDel = delegate (string msg)
{
Console.WriteLine("\n\nDel의 익명함수 방식 객체 : "+msg);
};
anonymDel("오 이런 식으로 되는구나\n\n\n");
//익명함수 방식으로 delegate 객체 생성
//익명함수란 원래 객체 생성 시점에 함수(메소드)의 이름은 없이 막바로 함수 본체가
//주어지면서 객체 생성되는 형태이다.
//따라서 아래에서 MyDel의 조건인 매개인자로 string 하나, int형 하나를 받고
//반환 데이터 타입이 string이라는 조건만 만족시켜주면 함수 본체는
//내용이 어떠하든지 상관이 없다.
MyDel anonymMyDel = delegate (string addr, int sex)
{
string gender = "";
if (sex == 1)
{
gender = "남성";
} else if (sex == 0)
{
gender = "여성";
}
return "주소 : " + addr + ", 성별 : " + gender;
};
Console.WriteLine(anonymMyDel("서울특별시 강남구 아무개길 77", 1));
//익명함수 방식의 delegate 객체 생성2
Del anonymDel = delegate (string msg)
{
Console.WriteLine("\n\nDel의 익명함수 방식 객체 : "+msg);
};
anonymDel("오 이런 식으로 되는구나\n\n\n");
}
private static void DelegateMethod(string msg)
{
Console.WriteLine("\n여기는 delegate method\nmessage sent from delegate object : \""+msg+"\"");
}
private static string AnotherDelegateMethod(string name, int age)
{
return name + ", age : " + age;
}
private static void mDel(string info)
{
Console.WriteLine("\n\n여기는 " + info + "~~~\n\n");
}
}
}
댓글 없음:
댓글 쓰기