대리자
2023. 7. 27.

대리자

-특정 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조를 나타냄

-매서드를 전달함(개념적)

               : 매서드를 가지고 있는 형식 인스턴스를 전달하는 것이지 메서드를 직접 전달하는 것은 아니므로 개념적이다.

               : 대리자 인스턴스를 통해 메서드를 호출

               : 매서드를 다른 메서드에 인수로 전달

-이벤트 기반 프로그래밍을 위해 사용

-"값'이 아닌 "코드"자체, 즉 기능을 넘기고 싶을 때 사용

 

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/delegates/

 

대리자 - C# 프로그래밍 가이드

C#의 대리자는 매개 변수 목록 및 반환 형식이 있는 메서드를 나타내는 형식입니다. 대리자는 메서드를 다른 메서드에 인수로 전달하는 데 사용됩니다.

learn.microsoft.com

콜백 메서드: 다른 함수에 인수로 전달되는 함수

 

[대리자의 사용]

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/delegates/how-to-declare-instantiate-and-use-a-delegate

 

대리자를 선언, 인스턴스화, 사용하는 방법 - C# 프로그래밍 가이드

대리자를 선언, 인스턴스화, 사용하는 방법을 알아봅니다. C# 1.0, 2.0 및 3.0 이상을 사용하는 예제를 살펴봅니다.

learn.microsoft.com

1. 대리자 형식 만들기

대리자 선언

 

한정자  delegate  반환_형식  대리자_이름  (매개변수_목록);

-사용자 지정 형식(enum, class,struct처럼)을 만들어야한다.

-대리자는 인스턴스가 아닌 형식이다.

public delegate int PerformCalculation(int x, int y);

-> 이 경우 PerformCalculation "형식" 인 것이다. (int는 반환형식)

 

2. 대리자 인스턴스 만들기

대리자가 참조할 메서드 선언

 

예제

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //형식 정의
        //메서드에 대한 참조를 가질 수 있는 형식: 대리자
        //2. 대리자 형식 정의
        //한정자 delegate 형식명 연결할 메서드 시그니처
        delegate void MyDelegate();
        //생성자
        public App()
        {

            //1. 메서드 정의 (시그니처가 대리자 형식과 같은 메서드)

            //3. 대리자 인스턴스 생성 및 메서드 연결 (대리자 초기화)
            MyDelegate myDel = new MyDelegate(this.SayHello);
            //4. 대리자 호출(연결된 메서드 호출)
            myDel();
        }

        //안녕하세요를 출력하는 메서드 //1번
        void SayHello()
        {
            Console.WriteLine("안녕하세요");
        }

    }
}

-시그니처가 동일하다면 메서드와 연결할 수 있다.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //2.대리자 형식 정의
        delegate void MyDelegate(string name);
       
        //생성자
        public App()
        {
            //3.대리자 인스턴스화
            MyDelegate myDel = new MyDelegate(this.SayHello);
            //4. 대리자 호출
                myDel("홍길동");
        }

        //1. 메서드 정의
        void SayHello(string name)
        {
            Console.WriteLine("{0}님 안녕하세요~", name);
        }

        void ByeBye(string name)
        {
            Console.WriteLine("{0}님 안녕히가세요~", name);
        }
    }
}

ByBye를 호출할 수도 있는 것이다.

 

 

대리자를 콜백 예제

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //2.대리자 형식 정의
        public delegate void MyDel();
        //생성자
        public App()
        {
            //3.대리자 인스턴스화(메서드 연결)
           MyDel myDel = new MyDel(this.HeroMoveComplete);

           Hero hero = new Hero();
            hero.Move(myDel);//HeroMoveComplete가 연결된 대리자 인스턴스를 인수로 전달
            //이 때 myDel이 콜백메서드가 됨
        }

        //1. 메서드 정의
        void HeroMoveComplete()
        {
            Console.WriteLine("[App] 영웅이 이동을 완료 했습니다.");
        }
        
    }

}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class Hero
    {

        //생성자
        public Hero() {
            Console.WriteLine("영웅이 생성되었습니다.");

        }

        //메서드
        public void Move(App.MyDel callback)
        {
            Console.WriteLine("이동중......");
            Console.WriteLine("이동중......");
            Console.WriteLine("이동중......");
            Console.WriteLine("이동중......");
            Console.WriteLine("이동중......");

            //4.대리자 호출
            callback();
        }
    }
}

대리자 콜백 예제 출력결과

익명 메서드

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //1. 대리자 형식 정의\
        delegate void MyDel();

        //생성자
        public App()
        {
           //2. 대리자 인스턴스화(무명 메서드 연결)
           MyDel del = delegate () {
               Console.WriteLine("안녕하세요~");
           };

            //대리자 호출
            del();
        }

       
    }

}

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //1. 대리자 형식 정의\
        delegate void MyDel(string name);

        //생성자
        public App()
        {
            //2. 대리자 인스턴스화(무명 메서드 연결)
            MyDel del = delegate (string name)
            {
                Console.WriteLine("{0}님 안녕하세요", name);
            };
            //3. 대리자 호출
            del("홍길동");
        }

       
    }

}

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //1. 대리자 형식 정의\
        delegate int MyDel(int a, int b);

        //생성자
        public App()
        {
            //2. 대리자 인스턴스화(무명 메서드 연결)
            MyDel del = delegate (int a, int b)
            {
                
                return a + b;
            };
            //3. 대리자 호출
            int sum = del(5, 7);
            Console.WriteLine(sum);
        }

       
    }

}

 

 

람다식(Lamda Expression)

-익명 메서드를 만들기 위해 사용한다.

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/lambda-expressions

 

람다 식 - 람다 식 및 익명 함수

익명 함수 및 식 본문 멤버를 만드는 데 사용되는 C# 람다 식입니다.

learn.microsoft.com

람다 선언 연산자 : =>

(input-parameters) => expression

 

-식 람다

(input-parameters) => { <sequence-of-statements> }

-문 람다

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //1. 대리자 형식 정의\
        delegate void MyDel(string name);

        //생성자
        public App()
        {
            //2. 대리자 인스턴스화(익명 메서드 연결, 람다문을 사용해서)
            MyDel del = (name) =>
            {
                Console.WriteLine("{0}님 안녕하세요.", name);
            };
            //람다에서 형식 유추: int a, int b로 쓰지않아도 int 유추

            //3. 대리자 호출
            del("홍길동");
        }

       
    }

}

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //1. 대리자 형식 정의
        delegate int MyDel(int a, int b);

        //생성자
        public App()
        {
            //2. 대리자 인스턴스화(익명 메서드 연결, 람다문을 사용해서)
            MyDel del = (a,b) =>
            {
                return a + b;
            };
            //람다에서 형식 유추: int a, int b로 쓰지않아도 int 유추

            //3. 대리자 호출
            int sum = del(10,24);
            Console.WriteLine(sum);
        }

       
    }

}

-인스턴스는 클래스.클래스는 참조형식. 널 가능

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class App
    {
        //1. 대리자 형식 정의
        public delegate void DelHeroMoveComplete();

        //생성자
        public App()
        {
            //대리자 인스턴스화 (람다/익명 메서드 연결)
            DelHeroMoveComplete del = () => {
                Console.WriteLine("이동 완료했습니다."); 
            };
            
            Hero hero = new Hero();
            hero.Move(del);
        }

       
    }

}

 

 

'C# 기초' 카테고리의 다른 글

JSON  (0) 2023.07.27
대리자2, Action, Func, 람다활용,  (0) 2023.07.27
개체 이니셜라이저  (0) 2023.07.26
가짜 인벤토리 만들기  (0) 2023.07.26
namespace, 컬렉션,  (0) 2023.07.26
myoskin