inflearn logo
강의

Course

Instructor

[MMORPG Game Development Series with C# and Unity] Part 1: Introduction to Basic C# Programming

Delegate

Sort 오름차순, 내림차순

323

0920choi4190

14 asked

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]으로 접근이 안되는데 어떻게 접근해야할까요?

C#

Answer 1

0

communityai8509

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

Generic에 대한 질문 있습니다.

0

95

2

2022 버전에 커뮤니티 버전이 없는데 2026 버전으로 해도 무관?

0

201

2

다형성 캐시 문제

0

112

3

.

0

71

1

프로퍼티 강의 질문 있습니다.

0

78

1

이후 커리 질문

0

86

1

static

0

91

2

강의에는 새로운 클래스 파일을 생성하면...

0

72

1

생성자의 이름 선언

0

65

1

9:03 Divide(10 , 3) 부분 질문입니다

0

88

1

깃허브 관련 질문 있습니다.

0

239

1

비쥬얼 스튜디오 업데이트가 된건가요..? 매개변수 오류 관련 질문

0

249

1

C# 시리즈 || C++ 시리즈 자료구조 강의에 대한 질문입니다!

0

306

2

Activator 질문있습니다

0

332

1

이넘 타임 선언 질문

0

346

1

질문 있습니다.

0

249

1

팩토리얼 문제

0

270

1

Sort함수 질문있습니다.

0

265

1

다형성 함수 질문 있습니다.

0

221

1

질문이 있습니다.

0

226

1

섹션2 연습문제 질문입니다.

0

213

1

안녕하세요~서버에 대해 질문이 있습니다.

1

281

1

텍스트 색깔이 제 편집기와 달라서 수강에 어려움이 있습니다ㅜㅜ

0

393

1

visual studio2022에서 c# 프로젝트 로드가 안됩니다

0

1158

3