[C#] delegate (델리게이트 / 대리자)와 Invoke

2022. 5. 31. 16:19·언어/C#
728x90

마이크로소프트에서는 delegate를 '특정 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조를 나타내는 형식'이라고 소개한다. 맞는 말이기는 한데 글로만 봐서는 delegate를 왜 사용하는지 전혀 알 수가 없다. delegate를 직접 사용하면서 함께 알아보자.

 

delegate는 메서드를 다른 메서드에 인수로 전달하는 용도다. 특히 함수 자체를 인수로 전달할 수도 있다. 

 

using System;

namespace Study
{
    delegate void Test(); // Test는 함수가 아니라 '형식'임. 함수 자체를 인자로 넘겨주는 형식.

    class Program
    {
        static void Button(Test testFunc)
        {
            testFunc(); // testFunc 함수 실행
        }

        static void Hi()
        {
            Console.WriteLine("안녕");
        }
            

        static void Main(string[] args)
        {
            Button(Hi);
        }
    }
}

 

 

결국 우리가 하고 싶었던 건 Hi()라는 함수를 실행하는 일이었다. 우리는 함수를 바로 실행하지 않고 Button 함수에 Hi를 넘겨주고 그 안에서 Hi를 실행시켰다. 이렇게 우리가 원하는 내용을 다른 함수에게 실행시켜 달라고 요청하여 실행시키는 일을 CallBack(콜백)방식이라 한다. delegate는 C#에서 CallBack을 담당한다.

복잡한 코드를 진행할 경우에는 함수를 바로 실행할 수 없는 상황이 있다. 함수 자체를 수정할 수 없는 상황이거나, 설계적인 문제로 코드를 분리시켜야 할 경우 delegate를 활용하여 함수 자체를 그 함수를 인자로 넘겨주고 실행시키는 등 delegate는 중요하게 사용된다.

 

 

그런데 testFunc를 실행시킬 때 Invoke라는 것을 추가해서 실행시켜도 같은 값이 출력된다.

 

testFunc.Invoke(); // testFunc 함수 실행

 

Invoke는 메소드를 호출하는 메서드다. 멀티 스레드 환경에서 일어나는 문제인 크로스 스레드를 해결할 때도 사용된다. 일반적으로 Invoke없이 메소를 실행해도 내부적으로 Invoke가 실행된다. delegate와 함께 사용하는 경우 delegate와 일반 함수를 구분할 수 있어 가독성이 높아지기 때문에 선호하는 사람이 있다.

728x90

'언어 > C#' 카테고리의 다른 글

[C#] ArraySegment를 이용하여 배열 가져오기  (0) 2022.06.07
[C#] 바이트 배열을 int로, int를 바이트 배열로  (0) 2022.06.04
[C#] 이벤트(event)란?  (0) 2022.05.27
[C#] Volatile이란?  (0) 2022.05.26
[C#] Dictionary란  (0) 2022.05.02
'언어/C#' 카테고리의 다른 글
  • [C#] ArraySegment를 이용하여 배열 가져오기
  • [C#] 바이트 배열을 int로, int를 바이트 배열로
  • [C#] 이벤트(event)란?
  • [C#] Volatile이란?
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (239)
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    라즈베리파이
    네트워크
    EFCore
    C#
    백준
    게임서버
    HTML
    tcp
    Python
    C언어
    java
    디자인패턴
    코딩
    EntityFramework
    C
    unity
    coding
    자바
    유니티
    Entityfamework
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[C#] delegate (델리게이트 / 대리자)와 Invoke
상단으로

티스토리툴바