2015년 9월 16일 수요일

[C#델리게이트강좌]버블소트예제

[C#델리게이트강좌]버블소트예제

/+*
델리게이트(Deligate)는 대리자라고도 하는데 C의 함수 포인터와 유사한데 자신이 실행시킬 메소드의 참조를 가지고 있다.
즉, 자기 자신이 실제 하는 일은 없고 단지 가리키고 있는 메서드를 호출하는 역할을 한다.
이러한 메소드에 대한 참조를 가리키고 있으므로 불가능한 작업 등이 가능해 진다. 
예를 들면 Delegete를 다른 함수의 인자로 넘겨주게 되면 그 함수는 델리게이트가 보내 주는 함수의 참조를 이용하여 
실행 시점에 호출될 함수를 결정 할 수 있다.
 *+/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication24
{
    class Dog
    {
        string name;
        public Dog(string name)
        {
            this.name = name;
        }
        public static bool MySort(object d1, object d2)
        {
            //이름순 오름차순정렬을 위해
            //앞에 있는 d1.name이 크면 뒤집으라고 true를 리턴
            return ((((Dog)d1).name.CompareTo(((Dog)d2).name) > 0) ? true : false);
           
        }
        public override String ToString()
        {
            return "Dog : " + name;
        }
    }

    class Emp
    {
        string name;
        int sal;
        public Emp(string name, int sal)
        {
            this.name = name;
            this.sal = sal;
        }
        public static bool MySort(object e1, object e2)
        {
            //급여순 오름차순정렬을 위해 
            //앞에 있는 e1.sal이 크면 뒤집으라고 true를 리턴
            return ((((Emp)e1).sal > ((Emp)e2).sal) ? true : false);            
        }

        public override String ToString()
        {
            return "Emp : " + name + ", " + sal;
        }
    }

    //우리가 만든 소트기
    delegate bool OjcDeligate(object obj1, object obj2);
    class OjcSorter
    {
        //obj는 정렬 대상, 정렬의 타겟
        //deli는 뒤집을지 말지를 결정하는 메소드를 참조하는 델리게이트
        public static void BubbleSort(object[] obj, OjcDeligate deli)
        {
            object tmp;

            for (int i = 0; i < obj.Length; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    //사용자가 작성한 정렬의 기준이되는 메소드를 호출하여 뒤짚을지를 결정
                    //비교대상 둘중 i는 뒤에 있는것, j는 앞에 있는것
                    if (deli(obj[j], obj[i]))   
                    {
                        tmp = obj[i];
                        obj[i] = obj[j];
                        obj[j] = tmp;
                    }
                }
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                Dog[] d = new Dog[4];
                d[0] = new Dog("멍멍이");                d[1] = new Dog("푸들이");
                d[2] = new Dog("진도이");                d[3] = new Dog("삽살이");

                OjcDeligate ojcDeligate = new OjcDeligate(Dog.MySort);
//d:정렬대상, ojcDeligate:뒤집을기준을정의한 메소드를 참조하는 델리게이트
                OjcSorter.BubbleSort(d,ojcDeligate);  

                Console.WriteLine("<<<<<<<<< Dog 정렬된 후 >>>>>>>");
                foreach (Dog dog in d)
                {
                    Console.WriteLine(dog);
                }

                Console.ReadLine();

                Emp[] e = new Emp[4];
                e[0] = new Emp("홍길이", 900); e[1] = new Emp("남길이", 800);
                e[2] = new Emp("오라클자바커뮤니티", 5000); e[3] = new Emp("김길동", 100);

                ojcDeligate = new OjcDeligate(Emp.MySort);
//e:정렬대상, ojcDeligate:뒤집을기준을정의한 메소드를 참조하는 델리게이트
                OjcSorter.BubbleSort(e, ojcDeligate);  

                Console.WriteLine("<<<< Emp 급여순 정렬된 후 >>>>");
                foreach (Emp emp in e)
                {
                    Console.WriteLine(emp);
                }
            }
        }
    }
}

/+*
 
 <<<<<<<<< Dog 정렬된 후 >>>>>>>
Dog : 멍멍이
Dog : 삽살이
Dog : 진도이
Dog : 푸들이

<<<< Emp 급여순 정렬된 후 >>>>
Emp : 김길동, 100
Emp : 남길이, 800
Emp : 홍길이, 900
Emp : 오라클자바커뮤니티, 5000
 
*+/

댓글 없음:

댓글 쓰기