ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 시작2
    @ 16. 1 ~ 17. 1/C# 2016. 11. 16. 22:03


    1. 컬렉션(Collection)


    우리가 이번 강좌에서 배우게될 '컬렉션(Collection)'이 뭐하는 녀석인지 간단히 알아봅시다. 컬렉션은 데이터의 검색과 저장을 위해 특화된 것이라고 말할 수 있습니다. 자료구조(Data Structure) 라고도 말할 수 있습니다. 컬렉션에서는 배열 리스트(Array List), 해시 테이블(Hash table), 큐(Queue), 스택(Stack) 등을 지원합니다. 하나하나 다 설명하다보면 강좌가 끝도 없이 길어질 것 같아, 간략하게 설명하겠습니다.



    1. 델리게이트!

    http://www.csharpstudy.com/CSharp/CSharp-delegate-concept.aspx





    오늘은 델리게이트(Delegate)에 대해서 알아보려고 합니다. 델리게이트는 한마디로 말해서 대리자라고 말할 수 있습니다. 즉, 대신 일을 해주는 녀석이라고 할 수 있겠죠? 다른 말로 해서는 메소드 참조를 포함하고 있는 영역이라고 말할 수 있습니다. 아래는 델리게이트의 선언 형식입니다.

    1
    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
    28
    29
    30
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace ConsoleApplication39
    {
        delegate int PDelegate(int a, int b);
     
        class Program
        {
            static int Plus(int a, int b)
            {
                return a + b;
            }
     
            static void Main(string[] args)
            {
                PDelegate pd1 = Plus;
                PDelegate pd2 = delegate(int a, int b)
                {
                    return a / b;
                };
     
                Console.WriteLine(pd1(5, 10));
                Console.WriteLine(pd2(10, 5));
            }
        }
    }

    결과:

    15

    2

    계속하려면 아무 키나 누르십시오 . . .


    코드를 보시면 9행에 PDelegate라는 델리게이트가 보이죠? 매개변수 부분에는 int형 매개변수 a, b를 명시해주었습니다. 13~16행에서는 Plus란 메소드가 정의되었습니다. 이제부터 자세히 보셔야 합니다. 20행을 먼저 봅시다. Plus 메소드 자체를 델리게이트에 집어넣고 있는것 같죠? Plus 메소드와 연결하여 대리자를 인스턴스화 합니다. 이제부터 델리게이트 pd1은 Plus 메소드를 참조하게 됩니다. 26행을 보시면 Plus 메소드를 쓰듯, a와 b를 더해서 값을 반환합니다. 21행을 보시면 아무 이름이 없는 메소드를 델리게이트에 집어넣습니다. 별도로 메소드를 만들지 않았죠? 이런 무명 메소드의 사용은 한번 사용하면 불필요해지는 메소드를 만들때도 사용되는 등, 매우 유용합니다. 27행도 26행과 마찬가지로 pd1처럼 사용할 수 있습니다.


    2. 델리게이트 체인(Delegate chain)


    델리게이트 체인이라고 하니, 무언가가 체인처럼 이어져 있을거라고 생각이 들지 않나요? 네, 맞습니다. 델리게이트 하나를 가지고 여러개의 메소드를 한번에 호출할 수 있습니다. 한번 볼까요?

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace ConsoleApplication39
    {
        delegate void PDelegate(int a, int b);
     
        class Program
        {
            static void Plus(int a, int b)
            {
                Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
            }
     
            static void Minus(int a, int b)
            {
                Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
            }
     
            static void Division(int a, int b)
            {
                Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
            }
     
            static void Multiplication(int a, int b)
            {
                Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
            }
     
            static void Main(string[] args)
            {
                PDelegate pd = (PDelegate)Delegate.Combine(new PDelegate(Plus),
                    new PDelegate(Minus), new PDelegate(Division), new PDelegate(Multiplication));
     
                pd(20, 10);
            }
        }
    }

    결과:

    20 + 10 = 30

    20 - 10 = 10

    20 / 10 = 2

    20 * 10 = 200

    계속하려면 아무 키나 누르십시오 . . .


    코드를 보시면 13~31행에 사칙연산(더하기, 빼기, 나누기, 곱셈) 메소드가 정의된 것을 보실 수 있습니다. 이제, 델리게이트를 이용하여 이 모두를 묶어주어 한꺼번에 호출할 수 있습니다. 35~36행을 보세요. Delegate.Combine 메소드가 쓰였습니다. 이 메소드는 두개 이상의 대리자의 호출 목록을 연결해주는 역할을 합니다. Plus와 Minus, Division, Multiplication 메소드는 이제 델리게이트 pd만 호출하여도 간편하게 모두를 호출할 수 있습니다.

    '@ 16. 1 ~ 17. 1 > C#' 카테고리의 다른 글

    참조형식과 값형식 차이, 함수 매개변수(in, out, ref)  (0) 2016.11.18
    getter setter  (0) 2016.11.18
    C# 시작  (0) 2016.11.16
    C# 3교시...  (0) 2014.07.27
    C# 2교시...C++차이점위주..  (0) 2014.07.26
Designed by Tistory.