항상 새로운 개념을 배울 때면, 나는 해당 단어가 무슨 뜻인지 찾아보곤 한다. 태초에 누군가 작명했을 때, 이유가 있으니까 해당 단어로 작명하지 않았을까 하는 생각도 있기 때문이다. 겸사 영어 공부도 하고..
🐧 Delegate
1. Delegates의 사전적 의미
Delegates
1. (집단의 의사를 대표하는) 대표(자)
2. (권한업무 등을) 위임하다
3. (대표를) 뽑다 [선정하다]
출처 : 네이버 사전
오늘 배울 것은 바로 이 친구다! 메서드들을 묶어서 관리할 수 있도록 도와주는 Delegates에 대해 알아볼까 한다.
2. 델리게이트의 선언과 형식
델리게이트는 '대표자, 위임하다'라는 사전적 의미를 가지고 있다. 한 마디로 메서드들의 대표자라고 생각하면 된다.
우리는 델리게이트라는 대표자를 세우고, 해당 대표자에게 메서드들을 위임해 준다. 이전에는 필요한 메서드들을 하나하나 호출해야만 했다면 우리는 델리게이트를 통해 메서드들을 호출하지 않고도 전부 호출하는 효과를 누릴 수 있다는 장점이 있다. 말로는 조금 어려우니, 일단 어떻게 생겼는지부터 빠르게 훑어보고 예제를 보도록 하자.
Delegate 선언 & 형식
[접근 제한자] delegate [리턴값] [delegate명] (매개 변수)
Example
public delegate void testDelegate (int num);
접근 제한자 : public, private, protected
리턴값 : int, float, bool, double...
매개 변수 : int num, float num, bool num, double num...
흠.. 초보자분들이 헷갈릴 수도 있겠다고 생각해서 색을 덕지덕지 발라보았는데.. 가독성이 더 떨어진 것만 같은?
무튼, 델리게이트라는 녀석은 저렇게 생겼다. delegate라는 녀석만 빼면 꼭 메서드를 빼다 닮았다. 여기서 우리가 짚고 넘어가야 할 부분은 매개 변수 부분이다. 델리게이트는 동일한 매개 변수를 가진 메서드만 취급한다. 한 마디로, '나랑 같은 편인 녀석만 (매개변수가 동일한 녀석만) 내 라인에 태우겠다'라고 볼 수 있다. 자, 바로 델리게이트 예제를 훑어보자.
using System;
// 델리게이트 선언
delegate int PlusDelegate(int a, int b);
class Program
{
public static void Main(string[] args)
{
// 델리게이트에 메서드 추가
PlusDelegate testDelegate = Plus;
// 델리게이트 실행 및 출력
Console.WriteLine(testDelegate(1, 2));
}
// 델리게이트에 추가할 메서드
static int Plus(int a, int b)
{
return a + b;
}
}
이해를 돕기 위해 두 수를 더한 값을 출력해 주는 예제를 하나 가져왔다.
3. 델리게이트 선언하기
// 델리게이트 선언
delegate int PlusDelegate(int a, int b);
먼저, int를 뱉어내는 (반환형이 int인) PlusDelegate라는 것을 만들어주었다. 그리고 이 PlusDelegate는 int형 변수 a와 b를 매개변수로 갖는다. 이렇게 되면 이 PlusDelegate라는 델리게이트 라인에는 int형의 변수 두 개를 매개 변수로 갖는 메서드들만 라인을 탈 수 있다.
(자꾸 '라인 라인'하는 이유는 건 최근에 더 킹이라는 영화를 봐서 그렇다..)
만약, 매개 변수의 형식과 수가 일치하지 않는 메서드들이 라인 타려고 쭈뼛쭈뼛 다가오면 우리 PlusDelegate 큰 형님은 본인과 결이 다른 녀석들을 과감하게 내치신다. 이건 아래서 다시 다뤄보도록 하겠다.
4. 델리게이트에 추가할 메서드 만들기
// 델리게이트에 추가할 메서드
static int Plus(int a, int b)
{
return a + b;
}
앞서 말한 PlusDelegate 라인을 타기 위해, 준비된 인재 Plus 메서드를 만들었다. 이 메서드는 PlusDelegate와 동일한 매개변수 타입과 개수를 가지고 있다. 이 녀석은 a와 b를 받으면 a + b, 둘을 더한 값을 토해낸다. 자, 준비는 끝이다. 곧바로 라인을 타러 가보자.
5. 델리게이트에 메서드 추가하기 & 결과
public static void Main(string[] args)
{
// 델리게이트에 메서드 추가
PlusDelegate testDelegate = Plus;
// 델리게이트 실행 및 출력
Console.WriteLine(testDelegate(1, 2));
}
델리게이트 라인 타는 법은 간단하다. 구조체나 클래스를 만들었을 때와 동일하게 델리게이트 타입과 델리게이트명을 적어주고 '=' 연산자나 '+=' 연산자를 통해 넣어주기만 하면 된다. 메서드와 델리게이트 두 녀석의 매개변수 타입과 개수가 동일하다면, 우리 델리게이트 형님들께서는 아무 말 없이 안아주신다.
실행하는 것도 어렵지 않다. 우리가 앞서 델리게이트를 선언할 때, 지정해 준 매개변수 타입과 개수에 맞게 매개변수를 넣어주면 된다. 나는 테스트를 위해 testDelegate에 int형으로 1과 2를 넣어줬다. 그러면 신기하게 델리게이트에 묶인 모든 메서드들에게 해당 매개변수가 전달된다.
생각보다 간단하지 않은가? 끝이다! 다시 한 번 쭉 코드를 훑어보고, 결괏값을 보도록 하자.
using System;
// 델리게이트 선언
delegate int PlusDelegate(int a, int b);
class Program
{
public static void Main(string[] args)
{
// 델리게이트에 메서드 추가
PlusDelegate testDelegate = Plus;
// 델리게이트 실행 및 출력
Console.WriteLine(testDelegate(1, 2));
}
// 델리게이트에 추가할 메서드
static int Plus(int a, int b)
{
return a + b;
}
}
반환할 형식과 매개 변수를 지정해준 델리게이트를 선언해 준다. 그리고 델리게이트에 추가할 메서드들을 만드는데, 이때 반드시 델리게이트의 매개변수와 동일해야 한다. 여기까지 끝마쳤다면 '=' 연산자와 '+=' 연산자를 통해 더해주고, 매개변수에 맞는 인자값들을 델리게이트에 넣어준다. 그러면 진짜 끝!
6. 델리게이트 체인 (Delegate Chain)
추가로, 델리게이트는 델리게이트 체인이라는 기능도 제공한다. 게임에서 체인 스킬 연계 같은 거라고 보면 된다. 사실 진짜 간단하다. 앞서 델리게이트는 대표자로서, 품에 안은 모든 메서드들을 호출한다고 말했다. 위의 예제에서는 메서드를 하나만 추가했었는데, 한 번 여러 개 메서드들을 등록해 보자. 이걸 델리게이트 체인이라고 한다.
using System;
// 델리게이트 선언
delegate void ChainDelegate(int a);
class Program
{
public static void Main(string[] args)
{
// 델리게이트에 메서드 추가
ChainDelegate chainDelegate = Chain1;
chainDelegate += Chain2;
chainDelegate += Chain3;
// 델리게이트 실행 및 출력
chainDelegate(1);
}
// 델리게이트에 추가할 메서드 1
static void Chain1(int num)
{
Console.WriteLine($"Chain1 : {num + 1}");
}
// 델리게이트에 추가할 메서드 2
static void Chain2(int num)
{
Console.WriteLine($"Chain2 : {num + 2}");
}
// 델리게이트에 추가할 메서드 3
static void Chain3(int num)
{
Console.WriteLine($"Chain3 : {num + 3}");
}
}
살짝 코드를 바꿔봤는데, 위에서 뜯어봤던 Delegate와 별반 다르지 않다.
// 델리게이트 선언
delegate void ChainDelegate(int a);
새롭게 만든 ChainDelegate는 int형 변수 하나만 매개변수로 갖는다. 이 말인즉슨, ChainDelegate에 등록된 모든 메서드들에게 int형 변수를 넘겨주겠다는 뜻이다.
// 델리게이트에 추가할 메서드 1
static void Chain1(int num)
{
Console.WriteLine($"Chain1 : {num + 1}");
}
// 델리게이트에 추가할 메서드 2
static void Chain2(int num)
{
Console.WriteLine($"Chain2 : {num + 2}");
}
// 델리게이트에 추가할 메서드 3
static void Chain3(int num)
{
Console.WriteLine($"Chain3 : {num + 3}");
}
Chain1, Chain2, Chain3 메서드들은 매개변수로 받아온 값에 각각 1, 2, 3을 더한 값을 콘솔에 출력한다.
// 델리게이트에 메서드 추가
ChainDelegate chainDelegate = Chain1;
chainDelegate += Chain2;
chainDelegate += Chain3;
// 델리게이트 실행 및 출력
chainDelegate(1);
델리게이트 체인을 사용해 chainDelegate에 각각의 메서드들을 더해주었고, chainDelegate(1);을 통해 델리게이트를 실행하면? chainDelegate는 등록된 모든 메서드들에게 1을 전달하고, 각각의 메서드들은 전달 받은 매개변수를 가지고 맡은 바 임무를 수행할 것이다.
짜잔~ 우리가 원했던 결과값을 볼 수 있다. 델리게이트는 이게 전부다. 다음 시간에는 델리게이트를 사용하는 Event라는 녀석에 대해 다뤄보겠다.
'프로그래밍 > C#' 카테고리의 다른 글
[C# 입문하기] #26. List (0) | 2023.09.04 |
---|---|
[C#] 콘솔창에서 작동하는 틱택토 (TikTacToe) 게임 만들기 (0) | 2023.08.13 |