Posted in: C# 언어, Unity, 메서드 & 팁 정리

C# 람다 | 즉석으로 함수 기능을 구현하자

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Messenger : MonoBehaviour
{
    public delegate void Send(string reciever);
    Send onSend;

    void Start()
    {
        onSend += SendMail;
        onSend += SendMoney;
    }

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            onSend("Angliss");
        }
    }

    void SendMail(string reciever)
    {
        Debug.Log("Mail sent to: " + reciever);
    }

    void SendMoney(string reciever)
    {
        Debug.Log("Money sent to: " + reciever);
    }
}

메시지를 대행해 주는 우체부 게임오브젝트를 만든다고 가정해보겠습니다.

위 스크립트는 onSend 델리게이트에 메시지를 출력하는 함수를 등록하고 Space를 입력하면 등록된 메시지를 출력하는 스크립트입니다.

그런데 메신저가 실시간으로 스크립트에 없는 함수를 받아서 도중에 전달할 수는 없을까요?

가능합니다. 그것이 람다입니다.

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

람다 함수는 이름이 없는 함수를 뜻합니다. 위에 작성된 코드는 함수이기도 하고 오브젝트이기도 합니다. man 이라는 입력을 받아서 어떻게 사용하는지 만든 것입니다.

람다 함수는 오브젝트처럼 주고 받을 수 있고 변수에 저장할 수 있습니다. 즉석으로 함수를 만들어서 저장할 수 있습니다.

지금은 축약된 버전으로 작성하였는데 man 앞에 타입은 C# 컴파일러가 람다 표현식을 사용할 때는 알아서 처리해줍니다. 하지만 사용하는 에디터에 따라서 안될수도 있습니다.

=> 화살표 연산자는 입력이 들어와서 화살표 방향으로 간다고 이해하면 됩니다.

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

위 람다 식은 축약되지 않은 경우입니다. 보기에도 함수처럼 보이지요?

입력에 타입을 명시할 수 있고 함수처럼 중괄호가 들어갑니다. 중괄호 안에서는 세미클론으로 처리를 나누어 더 많은 내용을 작성할 수도 있습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Messenger : MonoBehaviour
{
    public delegate void Send(string reciever);
    Send onSend;

    private void Start() {
        onSend += SendMail;
        onSend += SendMoney;

        onSend += (string man) => {
            Debug.Log("Assainate " + man);
            Debug.Log("Hide Body");
            };
    }

    private void Update() {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            onSend("Jinseok");
        }
    }

    void SendMail(string reciever)
    {
        Debug.Log("Mail sent to: " + reciever);
    }

    void SendMoney(string reciever)
    {
        Debug.Log("Money sent to: " + reciever);
    }

}

Start 함수에서 람다 식으로 함수의 이름을 선언하지 않고 함수 기능을 하는 코드를 작성하였습니다.

Tags:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다