갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (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)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

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

[C#] Delegate (2)

2020. 4. 4. 18:33
728x90
반응형

1. Delegate에 메소드를 등록하는 방법

using System;

delegate void FUNC(int arg);

class Test {
    public static void static_method(int arg) { }
    public void instance_method(int arg) { }
}

class Program {
    public static void static_method(int arg) { }
    public void instance_method(int arg) { }
    
    public static void Main() {
        FUNC f1 = Test.static_method;
        
        // FUNC f2 = Program.static_method; // ok
        FUNC f2 = static_method;            // ok
        
        Test t = new Test();
        FUNC f3 = t.instance_method;
        
        Program p = new Program();
        FUNC f4 = p.instance_method;
        
        p.foo();
    }
    
    public void foo() {
        FUNC f1 = this.instance_method;
        FUNC f2 = instance_method;
    }
}

 

Test 클래스안에 스태틱과 인스턴스 메소드가 있고
내 자신안에 스태틱과 인스턴스 메소드가 있다.
이제 Delegate를 이용하여 메소드의 정보를 담아볼건데
먼저 스태틱 메소드 같은 경우 객체가 없어도 클래스 이름만으로 호출할 수 있다.
그래서 15번째 라인과 같이 쓸 수 있다.
마찬가지로 내 자신안의 스태틱도 17~18번째 라인과 같이 쓸 수 있다.
앞에 클래스 이름인 Program은 써도 되고 안써도 된다.

반면 instance method는 객체가 필요하므로 객체 생성 후 사용하면 된다.

이번엔 위의 상태 그대로 foo함수를 호출해보자.
foo함수 같은 경우 이미 객체가 만들어진 상태이므로 this를 통해 호출 가능하다.
this가 없어도 상관없다.

 ① static method

    => 클래스 이름.메소드 이름

    => 자신의 메소드인 경우 클래스 이름은 생략가능

 

 ② instance method

    => 객체.메소드 이름

 

 


2. 익명 메소드 (Anonymous Method)

using System;

delegate int FUNC(int arg1, int arg2);

class Program {
    public static int Add(int a, int b) { return a + b; }
    
    public static void Main() {
        FUNC f = Add;
        
        Console.WriteLine(f(1, 2));
    }
}

 

Add라는 메소드가 있고 Main에서 사용중이다.
근데 Add가 위와 같이 한 번만 사용되고 다른 곳에서 쓸 일이 없다면
아래와 같이 만들 수 있다.
using System;

delegate int FUNC(int arg1, int arg2);

class Program {    
    public static void Main() {
        FUNC f = delegate(int a, int b) { return a + b };
        
        Console.WriteLine(f(1, 2));
    }
}

 

위의 코드 2개는 같은 기능을 하는 코드이다.
Add와 같은 기능을 하는데 이름이 없다. 이런 것을 익명의 메소드라고 한다.
가끔 사용하는데 가령 아래와 같은 상황에서 쓸 수 있다.
using System;

delegate int FUNC(int arg1, int arg2);

class Program {
    public static int Add(int a, int b) { return a + b; }
    
    public static void Main() {
        FUNC f = Add;
        
        Console.WriteLine(f(1, 2));
        
        Foo(Add);
        Foo(delegate(int a, int b) { return a - b });
    }
    
    public static void Foo(FUNC f) {
    }
}

 

17번째 라인의 Foo는 Delegate를 인자로 받는다.
그래서 13번째 라인과 같이 Add를 보낼 수 있는데 
더하는게 아닌 뺄셈이 필요하다고 할 때 특히 뺄셈은 한 번쓰고 말거라고 할 때
14번째 라인과 같이 보낼 수 있다. (메소드를 하나 더 만들 필요가 없게 됨)
728x90
반응형

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

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

    티스토리툴바