람다식을 배우기 전에 먼저 익명 메소드에 대해 알아보자.
익명 메소드
익명 메소드란 C# 2.0버전에서 나온 개념으로 이름이 없는 메소드로 일회성 메소드에 사용한다. 어떨 때 사용할까? 델리게이트에 전달되는 메소드가 일회성으로 필요할 때 사용한다.
익명 메소드 정의
델리게이트 변수 = delegate(매개변수 목록)
{
// 실핼 할 코드
};
익명 메소드는 위와 같이 정의 한다. 아래에서 기본적인 델리게이트 코드에서 익명 메소드를 사용한 코드로 변환을 해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LambdaEx : MonoBehaviour
{
delegate void TestDel();
void Start()
{
TestDel del;
del = TestFunc;
del.Invoke();
}
void TestFunc()
{
Debug.Log("TestFunc");
}
}
우리가 배웠던 델리게이트를 사용해 코드를 작성했다. 이 코드에서 TestFunc함수는 한 번 밖에 쓰이지 않는 코드이다. 이걸 익명 메소드로 변환하면 TestFunc 함수를 굳이 작성하지 않아도 같은 결과를 낼 수 있다. 익명 메소드를 활용해 코드를 변환해보자.
익명 메소드 사용 예시
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LambdaEx : MonoBehaviour
{
delegate void TestDel();
void Start()
{
TestDel del;
del = delegate()
{
Debug.Log("TestDel");
};
del.Invoke();
}
}
이렇게 일회성으로 사용하는 코드라면 따로 함수 작성 필요 없이 익명 메소드를 활용해 똑같은 기능을 구현할 수 있다.
즉, 익명 메소드란 말 그대로 따로 이름이 없이 일회성으로 사용하는 메소드이다.
매개 변수가 있는 익명 메소드 사용 예시
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LambdaEx : MonoBehaviour
{
delegate int TestDel(int num1, int num2); // int형 반환 타입과 int형 매개변수를 2개 받는 델리게이트 선언
void Start()
{
TestDel del;
del = delegate(int num1, int num2) // 델리게이트 시그니처에 맞게 작성
{
return num1 + num2;
};
int result = del.Invoke(3, 5);
Debug.Log(result);
}
}
위 처럼 델리데이트의 시그니처(반환 타입과 매개변수 목록)를 동일하게 만들어 주면 된다.
람다식
람다식은 C# 3.0버전에서 나온 개념이다. 람다식은 익명 메소드를 좀 더 간편하게 사용하는 개념이다.
람다식 정의
델리게이트 변수 = (매개변수 목록) => 식;
람다식의 기본적인 정의다. 람다식의 => 연산자를 이용해 정리한다.
람다 연산자 C# 공식 문서 참조 :https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/lambda-operator
람다 연산자 - '=>' 연산자는 람다 식을 정의하는 데 사용됩니다. - C# reference
C# => 연산자는 람다 식과 식 본문 멤버를 정의합니다. 람다 식은 데이터로 사용되는 코드 블록을 정의합니다.
learn.microsoft.com
람다식을 통해 위에서 익명 메소드를 사용한 코드를 변환해 보자.
람다식 사용 예시
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class LambdaEx : MonoBehaviour
{
delegate void TestDel(); // 반환 타입이 없고 매개 변수가 없는 델리게이트 선언
delegate int TestDel2(int num1, int num2); // 반환 타입 : int형, 매개 변수 : int, int 델리게이트 선언
void Start()
{
TestDel del;
del = () => Debug.Log("TestFunc");
del.Invoke();
TestDel2 del2;
del2 = (int num1, int num2) => num1 + num2;
int result = del2.Invoke(1, 2);
Debug.Log(result);
}
}
람다식을 사용하지 않았을 때의 코드와 비교해 본다면, delegate 키워드 생략, 중괄호 생략, return 타입이 있는 경우 return 생략을 할 수 있어 더 간편하게 사용할 수 있는 것을 볼 수 있다. 이렇게 => 람다 연산자를 이용하면 컴파일러가 형식 유추 기능을 제공하기 떄문에 사용이 가능하다.
문 형식의 람다식 정의
만약 코드가 한 줄이 아니라 여러 줄을 작성해야 할 경우 아래와 같은 형식으로 작성한다.
델리게이트 변수 = (매개변수 목록) =>
{
// 코드 1;
// 코드 2;
// 코드 3;
};
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LambdaEx2 : MonoBehaviour
{
delegate int TestDel(int num1, int num2);
void Start()
{
TestDel del;
del = (int num1, int num2) =>
{
Debug.Log("문 형식 람다식의 사용 예시");
Debug.Log("num1 + num2");
return num1 + num2;
};
Debug.Log(del.Invoke(3, 5));
}
}
위 처럼 중괄호를 활용해 여러 식을 넣어서 작성이 가능하다. 하지만 복잡한 로직을 담기에는 가독성을 떨어트리고 유지보수가 힘들다.
람다식은 일회성으로 편하게 사용하는 기능이기 때문에 델리게이트 체인같이 구독과 구독 해지에 관해서는 사용하기 어렵다. (추가 등록(구독)은 가능하지만 등록 삭제(구독 해지)는 불가하다)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LambdaEx3 : MonoBehaviour
{
delegate void TestDel();
void Start()
{
TestDel del;
del = TestFunc;
del += TestFunc2;
del -= TestFunc2;
del.Invoke();
}
void TestFunc()
{
Debug.Log("Hello");
}
void TestFunc2()
{
Debug.Log("Hello2");
}
}
위 코드를 람다식을 사용해서 구현해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LambdaEx3 : MonoBehaviour
{
delegate void TestDel();
void Start()
{
TestDel del;
del = () => Debug.Log("Hello");
del += () => Debug.Log("Hello2");
del -= () => Debug.Log("Hello2");
del.Invoke();
}
}
위 코드를 보면 += 연산자를 통해 Debug.Log("Hello2")를 구독 추가하고, -= 연산자를 통해 바로 해지를 했음에도 Hello2가 실행되는 것을 볼 수 있다. 이처럼 구독은 가능하지만 해지가 안되기 떄문에 델리게이트 체인에서는 사용하지 않는다.
이렇게 오늘 배운 람다를 정리해보자
람다식은 이름이 없는 익명함수로 별도의 메서드를 정의하지 않고 사용 가능, 코드를 간결하게 정리할 수 있다. 델리게이트의 시그니처(반환 형식, 매개변수 목록)을 동일하게 맞춰서 사용해야 한다.
단점은 델리게이트와 마찬가지로 디버깅하기가 어렵고,구독은 가능하지만 해지가 안되기 때문에 델리게이트 체인에서는 사용하지 않고, 복잡한 로직을 구현할 때 가독성이 떨어진다.
람다식 및 익명 함수 C# 공식 문서 참조 : https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/lambda-expressions
람다 식 - 람다 식 및 무명 함수 - C# reference
익명 함수 및 식 본문 멤버를 만드는 데 사용되는 C# 람다 식입니다.
learn.microsoft.com
람다식 블로그 참조 : https://unity-programming-study.tistory.com/40
[C#] 람다식(Lambda Expression)
C#에서람다식(Lambda Expression)은 코드의 간결성과 가독성을 높여주는 강력한 기능입니다. 이번 글에서는 람다식이 무엇인지, 어떤 특징이 있는지, 왜 사용하는지, 그리고 어떻게 사용하는지를 예
unity-programming-study.tistory.com
동영상 참조 : https://www.youtube.com/watch?v=YmNf5kzLbA4
'Unity C# > 개념 및 문법 정리' 카테고리의 다른 글
[Unity C#] Delegate (대리자), Delegate Chain 기본 개념 (0) | 2025.01.25 |
---|---|
[Unity C#] Lerp 함수 (0) | 2025.01.21 |
[Unity C#] Time.deltaTime (0) | 2025.01.21 |
[Unity C#] 객체 지향 _ 상속(추상 클래스, 인터페이스, 다중 상속) (1) | 2025.01.17 |
[Unity C#] 객체 지향 _ 다형성 (0) | 2025.01.16 |