본문 바로가기

프로그램/유니티 C# 강좌

[유니티 C# 강좌] 18. 익명 형식, 익명 메서드, 람다식, Func 대리자, Action 대리자

728x90
반응형

1. 익명 형식(Anonymous Type)

C#에는 이름 없는 형식이 존재하는데, 이 것을 익명 형식이라고 합니다.

익명 형식을 사용하면 명시적으로 형식을 정의할 필요 없이 읽기 전용 속성 집합을 단일 개체로 편리하게 캡슐화할 수 있습니다.

 

사용 방법 : 익명 형식

var 익명-형식-이름 = new { 속성-1 = 값-1, 속성-2 = 값-2 ... }

 

using UnityEngine; 

public class AnonymousTypeExample : MonoBehaviour 
{ 
    void Start() 
    { 
        var t = new { name = "Coderzero", age = 47 }; 
        Debug.LogFormat($"{t.name} {t.age}"); 
    } 
}

 

2. 익명 메서드(Anonymous Method)

모든 메서드는 이름을 가집니다.

하지만, C#은 대리자에서 사용하기 위해서 이름이 없는 무명 메서드가 지원합니다.

 

사용 방법 : 익명 메서드

delegate 데이터-형식 대리자-이름 (매개 변수)
...
대리자-이름 변수-이름 = delegate (매개 변수)
{
    return ... ;
}

 

using UnityEngine; 

public class AnonymousMethodExample : MonoBehaviour 
{ 
    delegate int MyDelegate(int a, int b); 

    void Start() 
    { 
        MyDelegate sum; 
        sum = delegate (int a, int b) 
        { 
            return a + b; 
        }; 
    } 
}

 

3. 람다식(Lambda Expression)

람다식은 무명 메소드처럼 사용되는 무명 함수입니다.

C# 3.0 부터 =>  연사자를 이용하여 람다식을 만들 수 있습니다.

 

사용 방법 : 람다식

(입력-매개-변수) ==> { 실행-문장 }

 

람다식은 대리자로 정의 후 사용합니다.

 

using UnityEngine; 

public class LambdaExpressionExample : MonoBehaviour 
{ 
    delegate int Calculate(int a, int b); 

    void Start() 
    { 
        Calculate calculate = (a, b) => a + b; 
        Debug.LogFormat($"{1} + {2} = {calculate(1, 2)}");  // 출력 : 1 + 2 = 3 
    } 
}

 

4. Func 대리자, Action 대리자

앞의 무명 메소드를 사용하기 위해서는 대리자를 선언해야 하는데, C#에서는 Func 대리자와 Action 대리자를 이용하여 참고만 하며 사용 할 수 있습니다.

 

Func 대리자와 Action 대리자의 차이는 Func 대리자는 반환형식이 있지만, Action 대리자는 반환형식이 없습니다.

 

네임스페이스

using System;

 

사용 방법 : Func 대리자
Func<매개변수-1 데이터-형식, 매개변수-2 데이터-형식, ...반환-데이터-형식>
// 제일 마지막이 반환값의 데이터 타입이고, 매개변수 데이터 형식은 0개도 가능함

Func<float> func1() = () => 0.1f; // 매개변수는 없고, 반환값은 float 형임
Func<intfloat> func2() = (a) => a* 0.1f; // int 형 매개변수는 1개가 있고반환값은 float 형임
Func<intintfloat> func3() = (a, b) => a* b; // int 형 매개변수는 2개가 있고반환값은 float 형임

 

사용 방법 : Action 대리자

Action<매개변수-1 데이터-형식매개변수-2 데이터-형식...>
// 매개변수 데이터 형식만 사용

Action action1() = () => Debug.Log("Action") // 매개변수는 없음
Action<int> action2() = (a) => a* 0.1f; // int 형 매개변수는 1개임
Action<int, int> action3() = (a, b) => a* b; // int 형 매개변수는 2개가 있임

 

using UnityEngine; 
using System; 

public class FuncActionExample : MonoBehaviour 
{ 
    void Start() 
    { 
        Func<int> func1 = () => 1; 
        Debug.LogFormat($"{func1()}"); // 출력 : 1  

        Func<int, int> func2 = (a) => a * 2; 
        Debug.LogFormat($"{func2(3)}"); // 출력 : 6  

        Action action1 = () => Debug.Log("Action"); // 출력 : Action  
        action1(); 

        Action<int, int> action2 = (a, b) => Debug.LogFormat($"{a} {b}"); // 출력 : 1 2  
        action2(1, 2); 
    } 
}

 

728x90
반응형