강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

최창우님의 프로필 이미지
최창우

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

Delegate (대리자)

Sort 오름차순, 내림차순

작성

·

279

·

수정됨

0

대리자로 소트를 오름차순, 내림차순을 쉽게 구현할 수 있다고 하셨는데

namespace 4.델리게이트

{

internal class Program

{

delegate void Sort(int[] arr);

static void MinSort(int[] arr)

{

int id;

for(int i = 0; i < arr.Length - 1; i++)

{

id = i;

for (int j = i + 1; j < arr.Length; j++)

{

if (arr[j] < arr[id])

id = j;

}

int temp = arr[id];

arr[id] = arr[i];

arr[i] = temp;

}

}

static void MaxSort(int[] arr)

{

int id;

for (int i = 0; i < arr.Length - 1; i++)

{

id = i;

for (int j = i + 1; j < arr.Length; j++)

{

if (arr[j] > arr[id])

id = j;

}

int temp = arr[id];

arr[id] = arr[i];

arr[i] = temp;

}

}

static void PrintArr(int[] arr)

{

foreach (int a in arr)

Console.Write(a + " ");

Console.WriteLine();

}

static void Main(string[] args)

{

// delegate (대리자) 사용 빈도 높음 주의

int[] arr = new int[] { 20, 10, 40, 50, 15 };

Sort[] sort = new Sort[] { MaxSort, MinSort };

string str = Console.ReadLine();

switch (str)

{

case "max":

sort[0](arr);

break;

case "min":

sort[1](arr);

break;

}

PrintArr(arr);

}

}

}

 

혹시 이것도 그 편한 방법에 포함되는 코드라고 할 수 있을까요?

그리고

Sort sort = MaxSort;

sort += MinSort;

이렇게 두개의 함수를 추가한다하면

제가 위에서 보낸 코드 처럼 sort[0]으로 접근이 안되는데 어떻게 접근해야할까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

질문주신 코드에 대해 답변 드리자면, 전달하신 코드는 delegate(대리자)를 사용하여 배열을 오름차순과 내림차순으로 정렬하는 방법을 보여주고 있습니다. 따라서 이것 역시 여러 가지 방법 중 하나로서 대리자를 사용한 편리한 구현 방법이라고 할 수 있습니다.

Sort sort = MaxSort; sort += MinSort; 코드를 사용한 경우는 멀티캐스트 대리자의 개념을 활용하는 것입니다. 이 경우, sort 대리자는 MaxSortMinSort 두 메소드를 차례로 호출하도록 설정되지만, 배열이 MaxSort에 의해 한 번 정렬된 후 MinSort에 의해 다시 정렬됩니다. 따라서 이렇게 설정할 경우 마지막에 추가된 MinSort의 동작만 실질적으로 결과에 반영됩니다.

멀티캐스트 대리자에서 특정 함수를 호출하려고 할 때, sort[0]과 같은 인덱서 접근은 지원하지 않습니다. 멀티캐스트 대리자에 등록된 메소드들을 개별적으로 호출하고 싶다면, 대리자의 GetInvocationList() 메서드를 사용하여 대리자 체인을 개별 대리자 배열로 변환할 수 있습니다. 이 배열의 각 요소는 대리자로 캐스트하여 호출할 수 있습니다.

예를 들어, 다음과 같은 방식으로 멀티캐스트 대리자의 개별 메소드를 호출할 수 있습니다.

Delegate[] delegates = sort.GetInvocationList();
foreach (var d in delegates)
{
    ((Sort)d)(arr); // 여기에서 d는 Sort 타입으로 캐스팅되어 호출됩니다.
}

이 방법을 사용하면 sort 대리자에 등록된 각 메소드를 개별적으로 호출하며, 위의 예시처럼 MaxSortMinSort가 각각 배열에 대해 실행됩니다. 그러나 앞서 언급한 대로 결과는 마지막으로 실행된 정렬 메소드에 따라 결정됩니다.

최창우님의 프로필 이미지
최창우

작성한 질문수

질문하기