
델리게이트
델리게이트는 명사로는 대표(자), 동사로는 위임하다.. 라는 뜻을 가지고 있다.
함수나 메서드의 기능을 변수에 담아놓고 어디서 호출하더라도 그 기능을 대신 실행시켜 준다.
처음 배울때 어려운 개념중에 하나고, 완벽하게 쓰려면 한참은 더 공부해야 할 것 같다.
예시
- 우리는 성인 영화를 보여주는 스트리밍 사이트를 만들었습니다.
- 시청자의 나이를 받아서 성인이면 영화를 보여주고, 아니면 재생을 시키면 안됩니다.
public static void ShowAudltMovie(int age)
{
if(age >= 20)
{
Console.WriteLine("영화 재생");
}
else
{
Console.WriteLine("영화 재생 불가");
}
}
간단하게 성인인지를 판별하여 영화를 보여주는 코드를 짰습니다.
그리고 몇 달 후에,회사가 일본에 진출했습니다.
어라? 근데 일본의 성인 나이는 우리와 달라서 코드를 다시 짜야합니다..
public static void ShowAudltMovie_Japan(int age)
{
if (age >= 18)
{
Console.WriteLine("영화 재생");
}
else
{
Console.WriteLine("영화 재생 불가");
}
}
일본용 함수를 따로 만들어서 적용을 시켰습니다.
하지만 이런식으로 나라마다 영상재생 함수를 추가 한다면, 호출해야하는 함수도 매번 다르게 만들어야하고,
안에 if문으로 작업을 하더라도 나라가 추가되면 될수록 엄청나게 길어집니다.
public delegate bool AgeDelegate(int age);
public static void ShowAudltMovie(AgeDelegate ageDelegate,int age)
{
if(ageDelegate(age))
{
Console.WriteLine("영화 재생");
}
else
{
Console.WriteLine("영화 재생 불가");
}
}
bool을 리턴하고 int 형 변수를 매개변수로 받는 델리게이트를 선언했습니다.
이제 ShowAdultMovie에는 ageDelegate형 함수와, 나이만 넣어주면 됩니다.
public static bool KoreaAge(int age)
{
/*
로직
*/
return true;
}
public static bool JapanAge(int age)
{
/*
로직
*/
return true;
}
public static bool ChinaAge(int age)
{
/*
로직
*/
return true;
}
이런식으로 각 나라별로 함수를 만들어주었습니다.
나라별로 관리하기 때문에 수정하기도 편합니다.
static void Main(string[] args)
{
ShowAudltMovie(KoreaAge,20);
ShowAudltMovie(JapanAge, 20);
ShowAudltMovie(ChinaAge, 20);
}
이런식으로 함수만 넣어주면 끝입니다.
저도 영상으로 배운 예시와 비슷하게 사용을 했지만,
아마 이 사례보다 더 유용하게 쓰일 곳이 많을 것 같습니다.
이벤트
이벤트도 델리게이트의 일종인데, 말그대로 클래스 내에서 어떠한 이벤트가 생겼을때,
내 구독자들에게 '이 이벤트가 일어 났어요~~' 라고 알려주고, 구독자들이 등록한 함수들을 실행하게 해준다.
이벤트를 알려주는 쪽과 이벤트의 발생 알림을 받는 구독자쪽이 서로 알 필요가 없기때문에, 코드가 꼬이지 않고 상호 의존성이 떨어져 수정에도 용이하다는 이점이 있다.
예시
class ProtectSystem
{
public delegate void myEvent();
public event myEvent findVirusEvent;
public void SearchVirus(int files)
{
for(int i=1;i<=files;i++)
{
if(i % 100 == 0)
{
if(findVirusEvent != null)
findVirusEvent();
}
else
{
Console.WriteLine($"{i}번째 파일 .. 바이러스 검사 완료.");
}
}
}
}
바이러스를 검사하는 ProtecSystem 클래스를 만들었습니다.
myEvent라는 델리게이트를 선언하고 event를 붙여 findVirusEvent라는 이벤트를 만들어주었습니다.
SearchVirus함수에서 파일을 받아서 파일을 검사하는데,
100으로 나누어 떨어지는 숫자일때만 이벤트를 발생시켰습니다.
class Program
{
private static void Main(string[] args)
{
ProtectSystem system = new ProtectSystem();
system.SearchVirus(500);
}
}
이런식으로만 함수를 실행시키면, 이 시스템이 바이러스를 발견했는지 메인함수에선 알 길이 없습니다.
하지만 우리는 바이러스를 발견할때마다 이벤트가 호출되도록 코드를 짜두었으니, 이벤트를 등록해주기만 하면 됩니다.
class Program
{
private static void Main(string[] args)
{
ProtectSystem system = new ProtectSystem();
system.findVirusEvent += FindVirus;
system.SearchVirus(500);
}
public static void FindVirus()
{
Console.WriteLine("바이러스다!!");
}
}
FindVirus라는 함수를 만들어서 이벤트에 등록을 해주었습니다.
이제 바이러스를 발견할때마다 FindVirus가 실행될겁니다.

총 500번 돌렸으니, 5번 바이러스를 발견했습니다.
델리게이트와 이벤트의 차이점

델리게이트는 선언한 클래스 외에 다른 클래스에서도 바로 호출이 가능합니다.
하지만 이벤트는 선언한 클래스가 아니라면 바로 호출할 수 없습니다.
'프로그래밍 공부 > C# 프로그래밍' 카테고리의 다른 글
[C#] 강력한 데이터 작업 Linq(링큐) (0) | 2023.09.24 |
---|---|
[C#] 여러개의 Enum - [Flags] Attribute (0) | 2023.09.24 |
[C#] re-throw? 그리고 throw vs throw EX (2) | 2022.09.18 |
[C#] 예외처리 Try - Catch / Throw & Finally (0) | 2022.09.18 |
[C#] 프로퍼티란? & 자동구현 프로퍼티와 public 변수와의 차이 찾아보기 (0) | 2022.08.24 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!