delegate는 C#이 가진 독특한 개념인데 따라서 기본적으로 생소한 개념으로 다가온다.
아래는 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이고
//이 데이터 타입이 가리킬수 있는 메소드는 argument로 string을 하나 받고 반환 값은 void인
//메소드가 있다면 그들 메소드들은 모두 delegate 이름이 Del인 새로운 데이터 타입으로 객체를 선언하고
//이 선언된 delegate 타입의 객체로 그들 메소드들을 실행할수 있다.
private delegate void Del(string message);
//아래는 새로운 데이터 타입인 MyDel이라는 이름의 데이터 타입을 선언하는데 이 데이터 타입은
//특별히 delegate형태의 데이터 타입이다.
//MyDel라는 데이터 타입으로 선언된 어떤 객체(참조변수)는 argument로 string 타입 하나, 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;
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");
}
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");
}
}
}
'Visual C#' 카테고리의 다른 글
C# 코드상에서 .tlb 생성 및 레지스트리 등록하는 법 (0) | 2018.01.18 |
---|---|
C# .dll library에서 MessageBox 사용하기(메시지 창 띄우기) (0) | 2018.01.11 |
C# 프로그램을 .dll Library로 만들기(C++에서 사용하기 위해) (0) | 2017.12.07 |
Visual Studio 2017에서 작업을 완료할수 없습니다. 해당 인터페이스를 지원하지 않습니다 (0) | 2017.12.06 |
C# 초 간단 쓰레드(Thread) 예제 (0) | 2017.11.23 |