Unity/C#

[C#] Delegate : Action, Func

HungryK 2025. 3. 16. 22:08

공부용으로 작성되는 페이지입니다. 틀린 부분이나 환경에 따라 오류가 발생할 수 있습니다. 

 


지난 시간에 이어서 Delegate 관련을 공부해본다

 

 

[C#] Delegate(대리자) : Event, Lambda

공부용으로 작성되는 페이지입니다. 틀린 부분이나 환경에 따라 오류가 발생할 수 있습니다.   1. Delegate 란?'대리자' 라는 의미를 가지고 있으며 함수의 주소값을 가지고 대신 호출한다. Class, A

hungrykang.tistory.com

 

함수의 대리 호출을 위해서 선언하는 것은 번거로울 수 있으므로 EventHandler처럼 미리 선언된 Delegate를 사용해본다. 

Delegate의 일종이므로 앞서 배웠던 체인이나 람다식도 사용할 수 있다. 이 두 가지를 사용하는 이유는 결국 코드의 간소화를 위해 사용한다고 볼 수 있다. 참고로 둘 다 using.System을 네임스페이스에 선언해주는 걸 잊지말자.

 

들어가기 전 결론부터 말하자면 반환해야할 값이 있는 경우 Func, 없을 경우 Action을 사용해줘야한다.

1. Action

Action은 반환타입과 매개변수가 없는 델리게이트이다.(=void) 매개 변수가 없기 때문에 제네릭 방식을 사용하여서 보완할 수 있다.

이 경우 매개변수는 0~16개까지 가질 수 있다. 

 

ex)

   Action<string, string, string,string> action;

    void Start()
    {
        action = StringTest;
        action.Invoke("Dog","Cat","Horse","Human");
    }
    
    public void StringTest(string text1, string text2, string text3, string text4)
    {
        Debug.Log(text1 + text2 + text3 + text4);
    }

 

 

2. FUNC

Action과 유사하지만 반환 타입이 있고 매개변수가 없는 델리게이트이다. 또한 16개까지의 매개변수를 가질 수 있다.

 

 

public delegate TResult Func<out TResult>();
#Action과 달리 반환타입이 제네릭인것을 알 수 있다.

 

 

#예제: 각 플레이어에게 랜덤 아이템 부여 

#아이템리스트 
private string[] items =  { "gun", "Trash", "Magic Card", "Book", "Switch" };
#Func<T>로 랜덤 아이템 반환 
private Func<string> GetRandomItem;

void start()
{

#람다식, 
#유니티 엔진에 내장된 Random.Range로 위에 작성한 아이템 리스트에서 랜덤한 Length를 불러온 뒤
#GetRandomItem에 호출한다
GetRandomItem = () => items[UnityEngine.Random.Range(0, items,Length)];
#반환된 GetRandomItem 값을 item에 저장한다. 
string item = GetRandomItem(); 
Debug.Log(" You Get " + item);

}

 

각자 다른 아이템을 받았다

참고자료

 

 

 

C# 프로그래밍의 기초: Action과 Func

C#의 Action과 Func는 대리자(delegate)를 사용하는 강력하고 유연한 방식을 제공합니다. 이 두 가지는 특히 람다 표현식과 함께 사용할 때 코드를 간결하고 명확하게 만들어 주며, 개발자가 보다 함수

unialgames.tistory.com