Unity, C#/Event

유니티 이벤트 완벽하게 이해하기 4 - 액션과 람다 함수

DAEBAL STUDIO 2019. 3. 5. 18:44

액션과 람다 함수에 대해 이야기 하고자 합니다.실무에 많이 사용하므로 알아두는게 좋을 것 같습니다.

 

(진실한 세상을 꿈꾸며 : http://theeye.pe.kr/archives/2725)

 

 

액션
유니티에서 쓰기 쉽도록 미리 만들어진 델리게이트예를들어 코딩을 하다보면 "리턴값이 void 이고 입력값이 없는 함수형"을 델리게이트로 사용할 일이 많습니다.그래서 처음부터 이런 타입을 Using System 내부에 만들어 놓았습니다. 이것을 Action이라고 합니다. 즉 단순히 델리게이트를 편하게 사용하기 위한 단축키 라고 생각하시면 되겠네요. 
Action : 입력값이 없고, 리턴값이 없는 델리게이트 타입

아래에 간단한 예제를 보겠습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
 
public class ActionAndRamda : MonoBehaviour
{
    // delegate void Action(); --> 이 부분이 using System 내부에 구현되어 있습니다.
    Action work;
 
    void Start ()
    {
        // MoveBricks() 라고 하면 함수가 실행되는 것이므로 MoveBricks 라고 적습니다.
        work += MoveBricks; 
        work += DigIn;
    }
 
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            work();
        }
    }
 
    void MoveBricks()
    {
        Debug.Log("벽돌을 옮겼다.");
    }
 
    void DigIn()
    {
        Debug.Log("땅을 팠다.");
    }
 
}
cs


쉬운 예제이므로 별다른 설명은 생략하겠습니다.


람다 함수(익명 함수)

함수명이 없는 함수라고 생각하면 될 것 같습니다. 

설명은 간단하니 바로 예제를 보겠습니다.
Messager 가 있습니다. 메세지를 받으면 해당 사람들에게 전달하는 역할을 합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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;
 
        // 입력 => 함수내용
        onSend += man => Debug.Log("Assainate " + man);
    }
        
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            onSend("DaeUn");
        }        
    }
 
    void SendMail(string reciever)
    {
        Debug.Log("Mail sent to: " + reciever);
    }
 
    void SendMoney(string reciever)
    {
        Debug.Log("Money sent to: " + reciever);
    }
}
cs
onSend += man => Debug.Log("Assainate " + man);
 
위에 줄에서 
man => Debug.Log("Assainate " + man);
이 부분이 람다 함수입니다.
왼쪽 man 이 입력이고 오른쪽이 함수 내용입니다. 
man 의 타입을 정의하지 않아도 리턴값이 없고, 입력값이 string인 onSend에
추가하는 것이므로 c# 컴파일러가 알아서 string이라고 인식해 줍니다.
즉 onSend에 등록할 수 있는 이유도 람다 자체를 하나의 오브젝트로 인식하고 있기
때문인것 같습니다. 

 

위에 기술한 람다식을 기본 포맷으로 표현하면 아래와 같습니다.

 

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

 

이렇게 됩니다. 

만약 입력값이 없고 리턴값도 없다면 아래와 같이 쓰면 됩니다.

 

() => { Debug.Log("Assainate "); Debug.Log("Hide Body"); }