Unity Chapter 8-5. C# 프로그래밍 [고급] : 람다 함수

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 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");
        }
    }
}
  • 리턴은 없고 문자열 하나를 받는 델리게이트 onSendSendMail, 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# 컴파일러 똑똑함!
    • 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);


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기