갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 전세계게임매출순위
  • 2020년 게임 매출
  • 유니티 그래프 그리기
  • pc 게임 순위
  • 글로벌게임매출
  • pc게임 순위
  • C# 예외 처리
  • 유니티 그래프
  • c# 코루틴
  • C# boxing
  • C++ 소멸자
  • 게임 디자인 패턴
  • 알고리즘
  • c# Thread
  • C++
  • c# delegate
  • 유니티 골드그래프
  • 롤 골드그래프
  • 게임매출순위
  • Unity Graph
  • C++ virtual
  • c# collection
  • 강남 방탈출
  • 자바
  • C++ 상속
  • 게임 매출 순위
  • 전세계 게임 매출
  • c# unboxing
  • c# coroutine
  • 모바일 게임 순위

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C#] Delegate (1)
프로그래밍/C#

[C#] Delegate (1)

2020. 3. 30. 17:52
728x90
반응형

1. 핵심 정리

using System;

delegate void FUNC(int arg);

class Program {
    static void Main() {
        int    n = 10;
        double d = 3.4;
        string s = "hello";
        
        // ? f = foo;
        FUNC f = foo;
    }
    
    public static void foo(int arg) {
        Console.WriteLine($"foo : {arg}");
    }
}

 

정수형 데이터 타입을 담는 int
실수형 데이터 타입을 담는 double
문자열 데이터 타입을 담는 string
그렇다면 11번째 라인과 같이 함수를 담는 데이터 타입을 무엇일까?

 ① Delegate

    => 메소드(메소드의 호출 정보, 메소드 모양/주소)를 저장하는 타입

    => ( ) 연산자 또는 invoke() 메소드를 사용해서 저장된 메소드를 호출할 수 있다.

    => C/C++의 함수 포인터 개념과 유사

 


2. Delegate를 만드는 방법

using System;

class Program {
    static void Main() {
        FUNC f = foo;
        f(10);
    }
    
    public static void foo(int arg) {
        Console.WriteLine($"foo : {arg}");
    }
}

 

위의 코드에서 Delegate를 만든다고 해보자.
Main에서 foo함수의 정보를 담을 데이터 타입이 필요하다.
그래서 FUNC라는 데이터 타입을 만들어야한다. (타입의 이름은 상관없다) 
만드려면 먼저 foo 함수에서 타입, 이름, 인자를 복사한다.
그리고 클래스 밖에 붙여 넣는다.
using System;

void foo(int arg); // foo는 메소드

class Program {
    static void Main() {
        FUNC f = foo;
        f(10);
    }
    
    public static void foo(int arg) {
        Console.WriteLine($"foo : {arg}");
    }
}

 

위와 같으 형태가 되었다.
위의 형태는 함수의 모양이다.
delegate를 만드려면 앞에 delegate라고 적기만 하면 된다.
using System;

// void foo(int arg); // foo는 메소드
delegate void foo(int arg);

class Program {
    static void Main() {
        FUNC f = foo;
        f(10);
    }
    
    public static void foo(int arg) {
        Console.WriteLine($"foo : {arg}");
    }
}

 

위의 형태로 foo타입을 만들었다.
foo는 타입이 되었고 이 타입은 void를 반환하고 인자가 int인 메소드를 받는다.
우리는 타입의 이름을 FUNC로 하기로 했으니 이름만 바꿔주면 된다.
using System;

// void foo(int arg); // foo는 메소드
delegate void FUNC(int arg); // FUNC는 타입
                             // 메소드의 호출정보를 담는 타입

class Program {
    static void Main() {
        FUNC f = foo;
        f(10);
    }
    
    public static void foo(int arg) {
        Console.WriteLine($"foo : {arg}");
    }
}

 ① Delegate 만드는 방법

    => delegate 함수반환타입 Delegate이름(parameter list);

 


3. Delegate 원리

using System;

delegate void FUNC(int arg);

/*
class FUNC : System.MulticastDelegate {
    // ...
}
*/

class Program {
    static void Main() {
        FUNC f = foo;
        f(10);
    }
    
    public static void foo(int arg) {
        Console.WriteLine($"foo : {arg}");
    }
}

 

3번째 라인과 같이 Delegate를 만들게 되면
6~8라인과 같이 컴파일러가 클래스를 만들어준다.
해당 클래스는 Delegate의 모든 기능을 가지고 있는 System.MulticastDelegate를 상속 받으며
안에 Invoke와 같은 메소드가 있다.
그럼 클래스라면 생각해볼 내용이 있다.
원래 C#에서 클래스를 객체로 만드는 정확한 표기법은
FUNC f1 = new FUNC(foo); 이고 Invoke도
f1.Invoke(10); 과 같이 사용해야 한다. 문제는 없다.
하지만 위의 코드의 Main에서 쓴것과 같이 적어도 컴파일러가 알아서 처리해준다.

 ⓛ FUNC는 메소드의 호출정보를 저장하는 타입

728x90
반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] Delegate Example  (0) 2020.04.06
[C#] Delegate (2)  (0) 2020.04.04
[C#] 제너릭 제약 (Generic Constraint)  (0) 2020.03.27
[C#] 제너릭 (Generic)  (0) 2020.03.23
[C#] 인덱서 (Indexer)  (0) 2020.03.19
    '프로그래밍/C#' 카테고리의 다른 글
    • [C#] Delegate Example
    • [C#] Delegate (2)
    • [C#] 제너릭 제약 (Generic Constraint)
    • [C#] 제너릭 (Generic)
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바