[C#] Action, Func

Learning 

When: 1학년 7월 14일

 

How:

원래 Action과 Func에 대해선 어느 정도 알고 있었지만, 람다식을 배울 때 자주 사용되기 때문에 복습도 하고 제가 정확하게 알고 있는 것이 맞는지 확인도 할 겸 Action과 Func에 대해 공부를 하게 되었습니다.

 

Understanding:

Action

  • 정의 : C#에서 미리 정의된 델리게이트 중 하나입니다. 이게 무슨 소리인가 하면, 우리가 반환값과 매개변수가 한 개 있는 델리게이트를 만드려고 할 때, delegate void Del<T>(T a); 이런 식으로 대리자를 만들 것입니다. 반환값이 void인 메서드의 비율을 생각하면, 반환값이 void인 델리게이트도 사용할 일이 참 많을 텐데, 여기서 C#은 감사하게도 그런 델리게이트를 미리 만들어두었습니다. 그리고 무려 인수가 0개인 델리게이트, 인수가 1개인 델리게이트 등을 전부 미리 오버로드 해두어서, 무려 16개의 인수까지 받을 수 있는 델리게이트를 만들어 놓았습니다.

Func

  • 정의 : Func도 Action과 거의 비슷하지만, 반환값이 있는 델리게이트를 미리 선언해 놓은 것 입니다. 솔직히 C#에서 반환 값이 있는 대리자, 없는 대리자를 모두 구현해 놓았기 때문에, 이쯤 되면 그냥 event가 아닌 델리게이트는 굳이 선언할 필요 없을 것 같지만, out, ref 키워드가 필요할 때, 코드 가독성이 중요할 때, 확장성을 중요시할 때 직접 델리게이트를 선언합니다. 참고로 Func도 똑같이 인수를 16개 까지 받을 수 있도록 오버로드 되어 있고, 마지막 인수가 반환 형식이기 때문에 모든 매개변수의 수는 최대 17개, 최소 2개인 셈입니다.

사용법 : 둘 다 델리게이트만 알고 있어도 충분히 쉽게 쓸 수 있습니다. Action<int> action; 이것을 어렵게 생각하지 말고 그냥 과거의 내가 delegate void Action<T>(T a); 이것을 선언했다고 생각하시면 그냥 델리게이트 그 자체인 것을 알 수 있죠.
(일반화 설명 : https://hwanji203.tistory.com/48)

Func도 똑같이 void를 마지막 타입 인수로 바꾼다고 생각하시면 됩니다. 사실 애초에 람다식에 쓰는 것을 제외하면 일반 대리자 보다는 event를 많이 쓰는 편이기 때문에 event로 예시를 하나 들자면 이런 방식으로 대리자를 선언하지 않고 event를 사용할 수 있습니다. (애초에 event를 사용할 때 직접 대리자를 별도로 선언하는 방식은 잘 사용하지 않기 때문에 원래부터 이렇게 사용하시는 분이 많을 것 같긴 합니다.)

using System;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerInput : MonoBehaviour
{
    public event Action OnJumpKeyPress;

    public Vector2 MoveDir { get; private set; }

    public void OnMove(InputValue value)
    {
        MoveDir = value.Get<Vector2>();
    }

    public void OnJump()
    {
        OnJumpKeyPress?.Invoke();
    }
}

 

Result: 일반화 프로그래밍 덕에 미리 몇개만 만들어두면 그 안에서 실제로 사용할 때 쓸 거의 모든 대리자를 선언할 수 있다는 점 덕분에 C#은 우리가 사용할 대리자를 만들어 놓을 수 있었고, 그것이 Action과 Func로 우리는 특별한 경우가 아닐 때 이것들을 사용하여 귀찮음을 덜 수 있습니다.

'C#' 카테고리의 다른 글

[C#] 람다식(2)  (1) 2025.07.16
[C#] 람다식(1)  (2) 2025.07.15
[C#] List  (1) 2025.07.13
[C#] event 키워드  (1) 2025.07.09
[C#] 대리자 (Delegate)  (0) 2025.07.08