Unity Chapter 8-5. C# 프로그래밍 [고급] : 람다 함수
카테고리: Unity Lesson 1
태그: C Sharp Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 8. C# 프로그래밍 : 고급
🔔 람다 함수
람다 함수
: 마치 오브젝트를 탄생시키듯이 코드 도중에 이름이 없는 함수를 만들고 마치 변수에 값을 넣어 주듯이 여기저기에 줄 수 있다.
형식 👉 (input-parameters) => expression
📜Messenger.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Messenger : MonoBehaviour
{
public delegate void Send(string reciver);
Send onSend;
void SendMail(string reciever)
{
Debug.Log("Mail sent to: " + reciever);
}
void SendMoney(string reciever)
{
Debug.Log("Money sent to: " + reciever);
}
void Start()
{
onSend += SendMail;
onSend += SendMoney;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
onSend("anso");
}
}
}
- 리턴은 없고 문자열 하나를 받는 델리게이트
onSend
에 SendMail, SendMoney 함수를 등록했다.
람다 함수를 사용한 경우
SendMail, SendMoney 함수처럼 미리 구현된 함수 말고 실시간으로, 즉석으로 함수를 생성하여 델리게이트에 등록할 수 있다면 어떨까
람다 함수
: 함수의 이름이 없고 함수를 즉석으로 생성된다. 마치 오브젝트, 변수처럼 이리 저리 저장할 수 있는 값이 되기도 한다.
- 한 두줄 짜리의 문장으로 구성된 짧은 함수의 경우 미리 구현하지 않고 람다 함수로 즉석 실행하면 코드가 더 간결해진다.
람다 함수 형식
형식 👉 (input-parameters) => {expression;};
- 대괄호
{}
안에서 세미콜론으로 구분해가며 여러 줄 statement를 넣을 수도 있다. - 근데
()
와{}
는 생략하기도 한다.- 입력(매개변수)가 하나면
()
생략 가능 - statement가 하나면, 즉 한줄이면
{}
생략 가능
- 입력(매개변수)가 하나면
void Assaniate(string man)
{
Debug.Log("Assainate " + man);
}
위 코드와 아래 코드는 같은 기능을 한다.
man => Debug.Log("Assainate " + man);
- man => Debug.Log(“Assainate “ + man)
- 람다 함수다.
- 이름이 없고
- 즉석에서 구현됐다.
- man은 매개 변수가 되고
- 입력이 한개면 타입 안붙여줘도 (string 안붙여줘도) 알아서 컴파일러가 처리해준다.
- C# 컴파일러 똑똑함!
- 입력이 한개면 타입 안붙여줘도 (string 안붙여줘도) 알아서 컴파일러가 처리해준다.
- Debug.Log(“Assainate “ + man) 를 실행한다.
- 원래는 (string man) => { Debug.Log(“Assainate “ + man); }; 가 정식 표현인데 타입과 소괄호 대괄호를 생략했다.
- 람다 함수다.
(string man) => {
Debug.Log("Assainate " + man);
Debug.Log("Hide body");
};
- 여러 줄을 가진 람다 함수로 응용
📜Messenger.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Messenger : MonoBehaviour
{
public delegate void Send(string reciver);
Send onSend;
void SendMail(string reciever)
{
Debug.Log("Mail sent to: " + reciever);
}
void SendMoney(string reciever)
{
Debug.Log("Money sent to: " + reciever);
}
void Start()
{
onSend += SendMail;
onSend += SendMoney;
onSend += man => Debug.Log("Assainate " + man); // 👈
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
onSend("anso");
}
}
}
- 즉석에서 람다 함수를 만들어
onSend
에 저장했다.
람다식으로 표현된 일반 함수
한 두줄 밖에 안되는 함수들은 람다식을 사용하여 코드를 간결하게 만드는 것이 좋다.
- 구현된 일반 함수들을 람다식으로 표현하는게 가능하다.
- 훨씬 간결해진다.
예제 1
private int health = 0;
public void RestoreHealth(int amount) {
health += amount;
}
public bool IsDead() {
return (health <= 0);
}
위 함수는 아래의 람다식으로 바꿀 수 있다.
private int health = 0;
public void RestoreHealth(int amount) => health += amount;
public bool IsDead() => (health <= 0);
예제 2 : 프로퍼티
private int health = 0;
public int Health {
get { return health; }
set { health = value; }
}
public bool IsDead {
get { return (health <= 0); }
}
위 프로퍼티는 아래의 람다식으로 바꿀 수 있다.
private int health = 0;
public int Health {
get => health;
set => health = value;
}
public bool IsDead => (health <= 0);
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기