대리자
-특정 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조를 나타냄
-매서드를 전달함(개념적)
: 매서드를 가지고 있는 형식 인스턴스를 전달하는 것이지 메서드를 직접 전달하는 것은 아니므로 개념적이다.
: 대리자 인스턴스를 통해 메서드를 호출
: 매서드를 다른 메서드에 인수로 전달
-이벤트 기반 프로그래밍을 위해 사용
-"값'이 아닌 "코드"자체, 즉 기능을 넘기고 싶을 때 사용
https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/delegates/
콜백 메서드: 다른 함수에 인수로 전달되는 함수
[대리자의 사용]
1. 대리자 형식 만들기
대리자 선언
한정자 delegate 반환_형식 대리자_이름 (매개변수_목록);
-사용자 지정 형식(enum, class,struct처럼)을 만들어야한다.
-대리자는 인스턴스가 아닌 형식이다.
public delegate int PerformCalculation(int x, int y);
-> 이 경우 PerformCalculation "형식" 인 것이다. (int는 반환형식)
2. 대리자 인스턴스 만들기
대리자가 참조할 메서드 선언
예제
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//형식 정의
//메서드에 대한 참조를 가질 수 있는 형식: 대리자
//2. 대리자 형식 정의
//한정자 delegate 형식명 연결할 메서드 시그니처
delegate void MyDelegate();
//생성자
public App()
{
//1. 메서드 정의 (시그니처가 대리자 형식과 같은 메서드)
//3. 대리자 인스턴스 생성 및 메서드 연결 (대리자 초기화)
MyDelegate myDel = new MyDelegate(this.SayHello);
//4. 대리자 호출(연결된 메서드 호출)
myDel();
}
//안녕하세요를 출력하는 메서드 //1번
void SayHello()
{
Console.WriteLine("안녕하세요");
}
}
}
-시그니처가 동일하다면 메서드와 연결할 수 있다.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//2.대리자 형식 정의
delegate void MyDelegate(string name);
//생성자
public App()
{
//3.대리자 인스턴스화
MyDelegate myDel = new MyDelegate(this.SayHello);
//4. 대리자 호출
myDel("홍길동");
}
//1. 메서드 정의
void SayHello(string name)
{
Console.WriteLine("{0}님 안녕하세요~", name);
}
void ByeBye(string name)
{
Console.WriteLine("{0}님 안녕히가세요~", name);
}
}
}
ByBye를 호출할 수도 있는 것이다.
대리자를 콜백 예제
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//2.대리자 형식 정의
public delegate void MyDel();
//생성자
public App()
{
//3.대리자 인스턴스화(메서드 연결)
MyDel myDel = new MyDel(this.HeroMoveComplete);
Hero hero = new Hero();
hero.Move(myDel);//HeroMoveComplete가 연결된 대리자 인스턴스를 인수로 전달
//이 때 myDel이 콜백메서드가 됨
}
//1. 메서드 정의
void HeroMoveComplete()
{
Console.WriteLine("[App] 영웅이 이동을 완료 했습니다.");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
internal class Hero
{
//생성자
public Hero() {
Console.WriteLine("영웅이 생성되었습니다.");
}
//메서드
public void Move(App.MyDel callback)
{
Console.WriteLine("이동중......");
Console.WriteLine("이동중......");
Console.WriteLine("이동중......");
Console.WriteLine("이동중......");
Console.WriteLine("이동중......");
//4.대리자 호출
callback();
}
}
}
익명 메서드
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//1. 대리자 형식 정의\
delegate void MyDel();
//생성자
public App()
{
//2. 대리자 인스턴스화(무명 메서드 연결)
MyDel del = delegate () {
Console.WriteLine("안녕하세요~");
};
//대리자 호출
del();
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//1. 대리자 형식 정의\
delegate void MyDel(string name);
//생성자
public App()
{
//2. 대리자 인스턴스화(무명 메서드 연결)
MyDel del = delegate (string name)
{
Console.WriteLine("{0}님 안녕하세요", name);
};
//3. 대리자 호출
del("홍길동");
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//1. 대리자 형식 정의\
delegate int MyDel(int a, int b);
//생성자
public App()
{
//2. 대리자 인스턴스화(무명 메서드 연결)
MyDel del = delegate (int a, int b)
{
return a + b;
};
//3. 대리자 호출
int sum = del(5, 7);
Console.WriteLine(sum);
}
}
}
람다식(Lamda Expression)
-익명 메서드를 만들기 위해 사용한다.
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/lambda-expressions
람다 선언 연산자 : =>
(input-parameters) => expression
-식 람다
(input-parameters) => { <sequence-of-statements> }
-문 람다
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//1. 대리자 형식 정의\
delegate void MyDel(string name);
//생성자
public App()
{
//2. 대리자 인스턴스화(익명 메서드 연결, 람다문을 사용해서)
MyDel del = (name) =>
{
Console.WriteLine("{0}님 안녕하세요.", name);
};
//람다에서 형식 유추: int a, int b로 쓰지않아도 int 유추
//3. 대리자 호출
del("홍길동");
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//1. 대리자 형식 정의
delegate int MyDel(int a, int b);
//생성자
public App()
{
//2. 대리자 인스턴스화(익명 메서드 연결, 람다문을 사용해서)
MyDel del = (a,b) =>
{
return a + b;
};
//람다에서 형식 유추: int a, int b로 쓰지않아도 int 유추
//3. 대리자 호출
int sum = del(10,24);
Console.WriteLine(sum);
}
}
}
-인스턴스는 클래스.클래스는 참조형식. 널 가능
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Starcraft
{
public class App
{
//1. 대리자 형식 정의
public delegate void DelHeroMoveComplete();
//생성자
public App()
{
//대리자 인스턴스화 (람다/익명 메서드 연결)
DelHeroMoveComplete del = () => {
Console.WriteLine("이동 완료했습니다.");
};
Hero hero = new Hero();
hero.Move(del);
}
}
}
'C# 기초' 카테고리의 다른 글
JSON (0) | 2023.07.27 |
---|---|
대리자2, Action, Func, 람다활용, (0) | 2023.07.27 |
개체 이니셜라이저 (0) | 2023.07.26 |
가짜 인벤토리 만들기 (0) | 2023.07.26 |
namespace, 컬렉션, (0) | 2023.07.26 |