나만의 작은 도서관

[C#] 문법 정리 #12. Func, Action 키워드 본문

Unity/문법 및 메소드(System)

[C#] 문법 정리 #12. Func, Action 키워드

pledge24 2024. 11. 25. 18:10

Func, Action

Func과 Action델리게이트를 대체하는 미리 정의된 제네릭 형식이다. Func와 Action의 차이점은 리턴값의 유무로 구분되며, 리턴값이 있다면 Func, 리턴값이 없다면 Action이다. 

 

기본 형식

// Func 선언 형식
Func<T1, T2, ..., 리턴값> Func_이름;

// Action 선언 형식
Action<T1, T2, ...> Action_이름;

 

사용 예제(Func)

// Func를 사용하여 두 개의 정수를 더하는 메서드
int Add(int x, int y)
{
    return x + y;
}

// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);

// 익명 메서드와 함께 사용한 Func
Func<string, int, string> repeat = (str, count) => string.Concat(Enumerable.Repeat(str, count));
Console.WriteLine(repeat("Hi", 3)); // 출력: HiHiHi

 

 

사용 예제(Action)

// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
    Console.WriteLine(message);
}

// Action을 이용한 메서드 호출
Action<string> printAction = PrintMessage;
printAction("Hello, World!");

// 익명 메서드와 함께 사용한 Action
Action<string> printMessage = (message) => Console.WriteLine($"Message: {message}");
printMessage("This is an Action example!"); // 출력: Message: This is an Action example!

 

Func, Action을 사용하는 이유

Func과 Action은 델리게이트로 이루어진 기능이다. 그렇기에 기존의 델리게이트와 비교가 될 수 밖에 없는데, 델리게이트+람다식 대신 Func과 Action을 사용하는 이유는 다음과 같다.

 

delegate 구문이 없다.

델리게이트를 사용하려면 delegate로 시작하는 델리게이트 구문으로 반드시 선언해야한다. 하지만 Func, Action을 사용하면 별도의 델리게이트 타입을 선언하지 않고 간단히 시그니처(매개변수, 리턴값을 말함)를 정의하여 사용할 수 있다. 이로써 다음과 같은 효과를 기대할 수 있다.

  • 코드가 간결하다.
  • 가독성이 높아진다.
  • 복잡해질수록 delegate보다 관리하기가 쉽다
// 델리게이트 선언
public delegate int Calculate(int x, int y);

// 델리게이트 사용
Calculate add = (x, y) => x + y;
Console.WriteLine(add(10, 20)); // 출력: 30

// Func 사용(델리게이트와 동일한 기능)
Func<int, int, int> add = (x, y) => x + y;
Console.WriteLine(add(10, 20)); // 출력: 30

 

 

.NET 기능과의 연동

Func, Action은 .NET 기능인 LINQ, Task, EventHandler와 같은 다양한 .NET 기능과 자연스럽게 통합할 수 있다. 예시는 아래와 같다.

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// Func를 사용한 조건 필터링
Func<int, bool> isOdd = x => x % 2 != 0;
var oddNumbers = numbers.Where(isOdd);

Console.WriteLine(string.Join(", ", oddNumbers)); // 출력: 1, 3, 5

 

결론

  • Func과 Action 델리게이트를 대체하는 미리 정의된 제네릭 형식이다.
  • delgate구문이 없어 코드를 보다 간결하고 가독성 높게 작성할 수 있다는 점과 .NET 기능과 연동된다는 점 등의 장점이 있다.