티스토리 뷰

- delegate는 함수(메서드)를 담을 수 있는 타입이다.

- 타입이기 때문에 메서드의 매개변수나 리턴타입 같은 곳에도 delegate타입을 선언 할 수 있다.

- 델리게이트에 메서드를 여러개 담을 수 있다.


다음은 델리게이트의 사용 예이다.


 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
    delegate void OperDelegate(int n1, int n2);

    class Oper
    {

        public void Add(int n1, int n2)
        {
            Console.WriteLine(n1 + n2);
        }

        public void Sub(int n1, int n2)
        {
             Console.WriteLine(n1 - n2);
        }

        public void Mul(int n1, int n2)
        {
             Console.WriteLine(n1 * n2);
        }

        public void Div(int n1, int n2)
        {
             Console.WriteLine(n1 / n2);
             Console.WriteLine();
        }

    }


1
2
3
4
5
6
7
8
9

Oper op = new Oper(); OperDelegate od = new OperDelegate(op.Add); od += op.Sub; od += op.Div; od += op.Mul; od(1, 2); //OperDelegate의 참조변수 od를 메서드명처럼 사용해서 이 델리게이트에 //존재하는 모든 메서드에 대하여 작업을 수행한다.


delegate는

delegate 리턴타입 델리게이트명(매개변수)

와 같이 정의한다.


이 delegate에 들어갈 수 있는 메서드는 리턴타입과 매개변수의 갯수,타입이 일치해야 한다.


위의 코드는 사칙연산을 delegate에 넣어서 사용하는 것이다.

OperDelegate라는 delegate를 인스턴스처럼 생성해서 사칙연산 메서드를 넣고 있으며,

최종적으로 delegate타입의 참조변수를 통해서 매개변수로 1, 2 정수값을 넣고 사직연산 메서드를 전부 수행하고 있다.




다음은 선택정렬 클래스의 코드이다.

 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 class SelectionSort{

        int[] arr;
        
        public SelectionSort(int[] arr)
        {
            this.arr = arr;
        }



        public void Sort()
        {
            int temp; //변경되는 배열 값을 담을 변수

            for (int i = 0; i < arr.Length; i++)
            {
                int lowPos = i; //비교되는 최소 값이 담길 변수
                for (int j = i+1; j < arr.Length; j++)
                {
                    if(arr[j] < arr[lowPos]){
                        lowPos = j;
                    }
                }
                //배열 값 변경 진행
                temp = arr[lowPos];
                arr[lowPos] = arr[i];
                arr[i] = temp;
            }



            //배열 출력
            Display();
                
        }

        private void Display()
        {
            foreach(int i in arr)
            {
                Console.Write(i + ", ");
            }
        }


    }

오름차순을 기준으로 선택정렬은 처음의 인덱스에 있는 값을 최소값으로 가정하고 그 다음의 인덱스들의 값들과 비교해서 

최소값을 찾아내 찾아낸 최소값을 맨앞의 인덱스에 저장하고 맨앞의 인덱스의 값은 원래 최소값이 있던 자리에 저장하고 

두번째 최소값을 찾아내기 위해 인덱스를 옮기면서 같은 작업을 반복한다.


이것을 코딩한 이유는 델리게이트의 쓰임새를 알아보기 위한 방법이다.

만약 정렬되는 기준이 int형 배열이 아니라 사용자정의 클래스 배열이거나 다른 기본형 타입이라면 어떻게 될까. 또는 오름차순이 아니라 내림차순이라면 어떻게 될까?

일반적으로는 불필요하게 클래스를 더 만들어서 구현하거나 아니면 SelectionSort클래스의 Sort메서드에 중요한 포인트인

if문으로 비교하는 곳을 다중if문을 쓰거나 switch문을 사용해서 여러번 작성 할 방법을 생각할 것이다.

이런 경우 코드가 길어지고 불필요하게 중복되는 코드가 생산될 수 있다.



다음은 대상이 사용자 클래스타입을 정렬하는 코드이다

 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
    delegate bool ObjDelegate(Object obj1, Object obj2);
    class Student
    {
        public int num; //학번
        public String name; //이름


        public static bool CompareNumAsc(Object o1, Object o2)
        {
            Student s1 = o1 as Student;
            Student s2 = o2 as Student;

            return s1.num < s2.num;
        }
        public static bool CompareNumDesc(Object o1, Object o2)
        {
            Student s1 = o1 as Student;
            Student s2 = o2 as Student;

            return s1.num > s2.num;
        }

        public override string ToString()
        {
            return "학번:" + this.num + ", 성명:" + this.name +"\n";
        }
    }


    class SelectionSort{

        Object[] arr;

        public SelectionSort(Object[] arr)
        {
            this.arr = arr;
        }


        public void Sort(ObjDelegate objDel)
        {
            Object temp; //변경되는 배열 값을 담을 변수

            for (int i = 0; i < arr.Length; i++)
            {
                int lowPos = i; //비교되는 최소 값이 담길 변수
                for (int j = i+1; j < arr.Length; j++)
                {
                    if (objDel(arr[j], arr[lowPos]))
                    {
                        lowPos = j;
                    }
                }
                //배열 값 변경 진행
                temp = arr[lowPos];
                arr[lowPos] = arr[i];
                arr[i] = temp;
            }



            //배열 출력
            Display();
                
        }

        private void Display()
        {
            foreach(Object i in arr)
            {
                Console.Write(i + ", ");
            }
        }


    }
 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
 static void Main(string[] args)
        {
           


            Student[] stu = new Student[4];
            stu[0] = new Student();
            stu[0].num = 103;
            stu[0].name = "홍길동";
            stu[1] = new Student();
            stu[1].num = 203;
            stu[1].name = "마봉춘";
            stu[2] = new Student();
            stu[2].num = 117;
            stu[2].name = "나영섭";
            stu[3] = new Student();
            stu[3].num = 99;
            stu[3].name = "남궁춘";

            

            //ObjDelegate objDel = new ObjDelegate(Student.CompareNumDesc);
            SelectionSort sel = new SelectionSort(stu);
            sel.Sort(Student.CompareNumDesc);
           
        }






Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday