일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 스프링부트
- Spring Boot
- level4
- 코딩테스트
- 쿼리
- WPF
- delegate
- springboot
- 1931번
- level3
- SQL
- 백준
- 3일컷
- Python
- 자바
- 씨샵
- Java
- MVVM
- c#
- 코테
- level2
- MySQL
- 닫기버튼
- programmers
- 델리게이트
- 운전면허
- 프로그래머스
- 보통2종
- 일반화
- JPA
- Today
- Total
욱꾸미의 주꾸미 발
[C#] Delegate에 대한 공부(2) 본문
저번시간에는 Delegate의 간단한 정의와 사용법에 대해 알아봤습니다.
그럼이제 Delegate활용 중 하나인 일반화와 Delegate의 활용법에 대해 알아봤습니다.
많이 길어졌네요. Delegate를 공부 중에 일반화를 몰라 먼저 공부해보다보니...
괄호 < 와 > 사이에 형식 매개변수를 넣어주면 됩니다.
간단한 예시입니다. Array를 통해 오름차순, 내림차순으로 Sorting하는 코드입니다.
Sorting방법은 버블소트입니다.
delegate int Comparer<T>(T a, T b);
먼저 사용할 delegate를 선언해 줍니다.
int를 사용하는 이유는 추후에 설명드리겠습니다.
static int AscendCompare<T>(T a, T b) where T:IComparable<T>
{
return a.CompareTo(b);
}
static int DescendCompare<T>(T a, T b) where T:IComparable<T>
{
return a.CompareTo(b) * -1;
}
다음은 오름차순, 내림차순으로 정렬을 해줄 코드입니다.
보시기에는 간단할 수 있지만 몇 가지 의문이 있습니다.
Icomparable과 a.CompareTo(b)는 무엇일까?
설명해주는 바로는 Icomparable을 상속해 CompareTo 메소드를 구현한 것입니다.
System.Int32(int), System.Double(double) 등과 같은 수치형식과 더불어 System.String(string)고 같은 문자형식도 비교합니다.
매개변수가 자기자신보다 크다면 -1, 같다면 0, 작다면 +1을 리턴합니다.
그러면 delegate선언시 왜 반환 데이터 형식이 int인지도 설명이 될거라 생각합니다. :D
다음은 Bubble Sort가 진행되는 부분입니다.
static void BubbleSort<T>(T[] DataSet, Comparer<T> Comparer)
{
int i = 0;
int j = 0;
T temp;
for(i=0;i<DataSet.Length-1;i++)
{
for(j=0;j<DataSet.Length-(i+1);j++)
{
if(Comparer(DataSet[j],DataSet[j+1])>0)
{
temp = DataSet[j + 1];
DataSet[j + 1] = DataSet[i];
DataSet[j] = temp;
}
}
}
}
기본적 버블소트와 구성은 같습니다만 다른점은 중첩 반복문 안에 Comparaer함수를 통한 비교에 있습니다.
해당 비교문을 볼까요?
if(Comparaer(DataSet[j],DataSet[j+1])>0)의 만족에 따라 오름차순 내림차순으로 정렬됩니다.
위의 코드에 보면 내림차순인 Descend의 리턴에는 *-1을 곱한뒤 리턴해 주는걸 볼 수 있습니다.
그렇기에 비교구문이 추가돼 있는걸 확인 할 수 있습니다.
다음은 Main입니다.
메인은 함수 호출등의 간단한 부분이 있습니다.
int[] array = { 3, 7, 4, 2, 10 };
Console.WriteLine("Sorting Ascending");
BubbleSort<int>(array, new Comparer<int>(AscendCompare));
for(int i=0;i<array.Length;i++)
{
Console.WriteLine("{0} ", array[i]);
}
string[] array2 = { "abc", "def", "ghi", "jkl", "mno" };
Console.WriteLine("\nSorting descending...");
BubbleSort<string>(array2, new Comparer<string>(DescendCompare));
for(int i=0;i<array2.Length;i++)
{
Console.WriteLine("{0} ", array2[i]);
}
Console.WriteLine();
int[]에 대해서는 오름차순으로 정렬하고, string[]에 대해서는 내림차순으로 정렬합니다.
결과입니다.
결과입니다.
Delegate가 꽤길어지네요. 다음은 Delegate Chain에 대해 공부할예정입니다.
공부내용은 '뇌를자극하는 C# 5.0 프로그래밍'이란 책을 참조하며 공부하고있습니다.
감사합니다. :D
'C#' 카테고리의 다른 글
[C#] double형 시간변환 관련 (0) | 2022.06.22 |
---|---|
[C#] Delegate에 대한 공부(3) Delegate Chain (0) | 2022.04.01 |
[C#] 일반화(3) (0) | 2022.03.02 |
[C#] 일반화(2) (0) | 2022.01.25 |
[C#] 일반화(1) (0) | 2022.01.14 |