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"); }