inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Delegate (대리자)

Sort 오름차순, 내림차순

323

최창우

작성한 질문수 14

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#

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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

94

2

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

0

200

2

다형성 캐시 문제

0

111

3

.

0

70

1

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

0

77

1

이후 커리 질문

0

85

1

static

0

90

2

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

0

72

1

생성자의 이름 선언

0

64

1

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

0

87

1

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

0

238

1

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

0

249

1

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

0

305

2

Activator 질문있습니다

0

331

1

이넘 타임 선언 질문

0

344

1

질문 있습니다.

0

248

1

팩토리얼 문제

0

270

1

Sort함수 질문있습니다.

0

264

1

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

0

221

1

질문이 있습니다.

0

225

1

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

0

213

1

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

1

281

1

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

0

393

1

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

0

1158

3