게임개발/스터디

[스터디] 람다 함수(익명 함수)란?

감물 2024. 4. 16. 18:48

저번 시간에는 유니티 델리게이트에서 배웠었다.

 

public class Messanger : MonoBehaviour
{
    public delegate void Send(string receiver);
    
    Send onSend;
    
    void Start()
    {
        onSend += SendMail;
        onSend += SendMoney;
    }
    
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
            onSend("Oscar");
    }
    
    void SendMail(string receiver)
    {
        Debug.Log("Mail sent to : receiver");
    }
    
    void SendMoney(string receiver)
    {
        Debug.Log("Money sent to : receiver");
    }

 

이런식으로 델리게이트 형을 만들고 등록할 함수를 그 형과 똑같이 만들어서 등록하여 델리게이트를 사용했다.

 

이번 시간에는 람다함수에 대해서 배워보겠다.

 

위의 함수 코드에서 없는 새로운 기능을 실시간으로 받아들여서 도중에 어떤 심부름을 한다고 해보겠다. 무슨 말이냐면 Start()에서 onSend에게 새로운 심부름을 맡길 건데 여기에는 없다. 즉, 즉석으로 심부름을 만들어 보겠다.

 

void Start()
{
    onSend += man => Debug.Log("Assassinate " + man);
}

 

man이라는 대상에게 어떤 사람들 죽이라는 명령을 하는 코드를 람다 함수로 작성해보겠다. 이 구현의 뜻은 man이라는 친구를 대상으로 하는 함수이고 그 친구의 실제 구현은 Debug.Log("Assassinate " + man) 이라는 뜻이다. 

 

조금 혼란스러울 수 있는데 람다 함수는 기본적으로 이름이 없는 함수를 뜻하는데

 

" man => Debug.Log("Assassinate " + man) "

 

위의 코드가 기본적으로 함수이다. man이라는 친구에게 어떤 동작을 하라는 코드는 만들었는데 이름이 없다!!

 

즉, 람다함수는 부르는 이름이 없는데 그 함수를 마치 오브젝트 혹은 값처럼 다른 친구들에게 변수로 던져 넣을 수 있지 않을까? 혹은 이리저리 주고 받을 수 있지 않을까? 라는 생각에서 시작된 것이 람다함수이다.

 

void Assassinate(string man)
{
    Debug.Log("Assassinate " + man);
}

 

이런 식으로 작성할 수도 있지만 이 Assassinate라는 함수 이름 자체를 날려버리고 실시간으로 만들어낼 수 있는 값처럼 이름을 없애버리고 다룰 수 있다는 얘기이다.