• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Sort 오름차순, 내림차순

24.04.09 17:45 작성 24.04.09 17:47 수정 조회수 58

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 인턴님의 프로필

인프런 AI 인턴

2024.04.11

안녕하세요, 인프런 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가 각각 배열에 대해 실행됩니다. 그러나 앞서 언급한 대로 결과는 마지막으로 실행된 정렬 메소드에 따라 결정됩니다.