C#의 메서드 그룹

Bilal Shahid 2023년10월12일
  1. C#의 메서드 그룹
  2. C#의 Delegates
  3. C#에서 DELEGATE를 사용한 메서드 그룹 변환
  4. C#의 메서드 그룹에 대한 간단한 사용자 지정 Delegate
  5. C#에서 메서드 그룹에 함수 포인터 사용
C#의 메서드 그룹

이 문서에서는 C#의 메서드 그룹을 다룹니다.

C#의 메서드 그룹

함수에 둘 이상의 구현이 있을 수 있는 경우가 있습니다. 완전히 다른 매개변수 집합 또는 유형을 가진 다른 정의가 있을 수 있거나 일반적으로 오버로드된 함수로 알려져 있습니다.

통사론:

void print(int x) {
  ///...code
}

void print(int x, int y) {
  ///...code for x and y
}

이러한 기능이나 메서드를 METHOD GROUPS라고 합니다.

C#의 Delegates

DELEGATES는 생성된 함수에 대한 포인터입니다. 함수를 가리키는 것과 함께 함수 및 해당 매개변수의 반환 유형도 정의합니다.

예를 들어 LAPTOP라는 대리자는 반환 유형이 void이고 매개변수가 USERNAME(문자열)일 수 있습니다. PC라는 또 다른 함수가 있습니다. 이 함수도 LAPTOP와 동일한 반환 유형 및 매개변수 유형을 가지고 있습니다.

이 시나리오에서 대리자 LAPTOP에서 PC를 호출할 수 있습니다.

코드 예:

delegate void LAPTOP(string username);

static void PC(string username) {
  Console.WriteLine("USER: " + username + " has logged in!");
}

static void Main() {
  LAPTOP lap1 = PC;
  lap1("Hydrogen");
}

LAPTOP 인스턴스를 PC로 인스턴스화했으며 나중에 호출하면 PC 메서드에서 전달된 사용자 이름을 인쇄하게 됩니다. 그것이 DELEGATES가 작동하는 방식입니다.

C#에서 DELEGATE를 사용한 메서드 그룹 변환

메서드 그룹의 가장 일반적인 용도 중 하나와 호출 시 처리 방법을 살펴보겠습니다. 메소드 그룹이 기본 메소드의 오버로드된 기능에 대해 논의했으며 DELEGATES를 사용하여 메소드 그룹을 원하는 대로 사용할 수 있습니다.

이 예에서 DASHBOARD, WHEEL, LIGHTS 등과 같은 여러 다른 방법을 처리하려는 CAR이라는 방법이 있다고 가정해 보겠습니다. 편의상 두 가지 방법만 사용합니다. ; LIGHTSMIRRORS.

코드 예:

delegate void CAR(bool start);

static void MIRROR(bool start) {
  if (start)
    Console.WriteLine("Mirror is now working!");
  else
    Console.WriteLine("Mirror is not stopped/closed");
}

static void LIGHTS(bool start) {
  if (start)
    Console.WriteLine("Lights are now working!");
  else
    Console.WriteLine("Lights have stopped/closed");
}

메서드를 정의했으므로 이제 MAIN 메서드를 구현해 보겠습니다. 여기에서 대리자를 사용하여 이러한 메서드 그룹을 처리합니다.

CAR car = MIRROR;
car(true);

car = LIGHTS;
car(false);

CAR 개체가 MIRROR를 가리키는 것을 알 수 있지만 나중에는 LIGHTS를 가리킵니다. 그런 다음 메서드를 호출하면 가리키는 함수가 호출됩니다.

함수의 이름은 car 개체에 할당됩니다. 그룹의 다른 메소드를 가리키도록 DELEGATE 포인터를 변경하는 것을 METHOD GROUP CONVERSION이라고 하며 이 시나리오에서 LIGHTS, MIRRORSCAR은 모두 동일한 메소드 그룹의 일부입니다.

C#의 메서드 그룹에 대한 간단한 사용자 지정 Delegate

METHOD GROUPS를 가리킬 수 있는 DELEGATE를 만드는 간단한 방법은 다음과 같습니다.

Func<string> f_test = "AA".ToString;
Console.WriteLine(f_test());

위를 호출하면 결과적으로 AA 문자열이 출력됩니다. F_TESTToString 메서드를 가리키고 호출합니다.

또한 이 함수는 함수 자체가 아니라 ToString 메서드의 주소를 가리키는 것을 알 수 있습니다. 이것이 포인터가 작동하는 방식입니다.

METHOD GROUPS를 올바르게 이해하기 위해 아래에 또 다른 예가 제공되었습니다.

Func<string, int> f_test = Convert.ToInt32;
Console.WriteLine(f_test("435"));

통사론:

Func<param1, param2> name;
//param1 is the parameter passed in the function/method pointed to
//param 2 is the return type of that function/method that the delegate points to

Convert.ToInt32INT의 반환 유형과 18 다른 오버로드를 갖습니다. F_TEST를 문자열 "435"로 호출하고 PARAM2STRING으로 정의하기 때문에 매개변수 유형을 정의하는 것이 필수적입니다.

PARAM2를 정의하는 것은 함수의 과부하가 하나만 있더라도 중요합니다. METHOD GROUPS는 컴파일된 시간 구성이므로 단일 오버로드에 대해 선택해야 합니다. PARAM2에 하나 이상의 과부하가 포함되어 있는지 확인하는 것이 중요합니다.

함수에서 List.Select(MethodGroup)를 호출할 때 LINQ에서 캐스트를 제거할 수도 있습니다. 이 기사는 METHOD GROUPS에 초점을 맞추기 때문에 LINQ 컨텍스트에 대해 자세히 논의하지 않습니다.

C#에서 메서드 그룹에 함수 포인터 사용

대리자로부터 다른 기능을 가리키는 것은 METHOD GROUPS에서 작업하는 경우에만 필요합니다. 이러한 상황에서 반환 유형과 매개변수가 일치하는지 확인해야 합니다.

C#은 이미 FUNC 키워드를 제공하여 다른 기능을 가리킬 수 있도록 합니다. 포인터가 객체와 변수의 주소를 가리킨 다음 호출하는 방식으로 작동하는 것처럼 대리자를 같은 방식으로 상상할 수 있습니다.

포인터는 또한 포인터가 주소를 지정하는 객체와 동일한 반환 유형을 갖는 경향이 있습니다. 대리자는 기능 요구 사항으로 인해 매개 변수도 처리해야 합니다.

함수를 가리키는 것은 배열에 함수를 저장하고 코드에 대해 동적으로 호출하거나 호출할 다른 함수에 함수를 전달하려는 경우에 필요합니다. LAMBDA 기능도 동일한 요구 사항을 충족합니다.

그러나 METHOD GROUPS는 기본 반환 및 매개변수 유형을 따르는 오버로드된 함수가 있는 일반적인 클러스터입니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

관련 문장 - Csharp Method