๐ŸŽฎ Unity Study/C#

[C#] Action ๊ณผ Func (feat. Delegate, callback)

ibelieveinme 2023. 8. 16. 19:06
728x90

Delegate: ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜

Action : ๋ฐ˜ํ™˜๊ฐ’์ด ์—†๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ

Func: ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ

callback: ์ž‘์—…์ด ๋๋‚ฌ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ์šฉ๋„


* Delegate

๊ธฐ๋ณธํ˜•ํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

public class TestClass {

    delegate void MyDelegate();

    public TestClass() {
        MyDelegate myDelegate = FuncTest;
        myDelegate();
    }

    public void FuncTest() {
    }
}

Delegate๋ฅผ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ดํƒ€์ž…, ์ธ์ž๊ฐ’์— ๋งž๊ฒŒ ์„ ์–ธํ•œ๋‹ค. ์‚ฌ์šฉ์ „์— ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•œ๋‹ค.

 

ํ™œ์šฉ1)

์–ด๋–ค ๋ฒ”์ฃผ ์•ˆ์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•  ๋•Œ

public class TestClass {

    delegate void DamageDelegate();
    DamageDelegate damageDelegate;
    
    private Attack() {
        calDelegate += ReduceGageBar;
        calDelegate += ReduceHeart;
    }

    private void ReduceGageBar() {
    	// gage bar ์ค„์ด๊ธฐ
    }

    private void ReduceHeart() {
    	// ์ฒด๋ ฅ์ค„์ด๊ธฐ
    }
}

 

ํ™œ์šฉ2)

ํŠน์ •๋™์ž‘์€ ๊ฐ™๊ณ  ํŠน์ •๋™์ž‘์€ ๋ถ„๊ธฐ๋กœ ๋‹ค๋ฅธ ๊ณตํ†ต๋ถ€๋ถ„์ด ์žˆ์„ ๋•Œ

public class TestClass {

    delegate int MyDelegate();

    private TestClass() {
        //Japan ์ด๋ฉด
        ShowMenu(GetAge_Japan);
        //Korean ์ด๋ฉด
        ShowMenu(GetAge_Korean);
    }

    private void ShowMenu(MyDelegate GetAge) {
        int age = GetAge();

        if(age >= 20) {
		//์„ฑ์ธ์ž…๋‹ˆ๋‹ค ์ถœ๋ ฅ
        }else {
		//๋ฏธ์„ฑ๋…„์ž์ž…๋‹ˆ๋‹ค ์ถœ๋ ฅ
        }
    }
    
    private int GetAge_Korean() {
        //ํ˜„์žฌ์ผ์‹œ - ์ƒ๋…„์›”์ผ + 1
        return 0;
    }

    private int GetAge_Japan() {
        //ํ˜„์žฌ์ผ์‹œ - ์ƒ๋…„์›”์ผ
        return 0;
    }
}

 

* Action/Func

   public class TestClass {
        private Action<int> _action;
        private Action<int, int> _action2;

        private Func<int> _func;
        private Func<int, string> _func2;

        public TestClass() {
            _action = SetData;
            _action2 = SetData2;
            _func = FuncTest;
            _func2 = FuncTest2;
        }

        private void SetData(int data) {

        }
        private void SetData2(int data, int data2) {

        }

        private int FuncTest() {
            return 0;
        }

        private string FuncTest2(int a) {
            return string.Empty;
        }
    }

Action ์€ SetData(), SetData2() ํ•จ์ˆ˜ ์ฒ˜๋Ÿผ ๋ฐ˜ํ™˜๊ฐ’์€ void ์ด๋‹ค.

Func๋Š” FuncTest(), FuncTest2() ํ•จ์ˆ˜ ์ฒ˜๋Ÿผ ๋ฐ˜ํ™˜๊ฐ’์ด ์กด์žฌํ•œ๋‹ค.

 

Action, Func ๋‘˜๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

Func์˜ ๋งจ ๋ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” return ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

Task, Action, Func ์‚ฌ์šฉ์˜ˆ)

using System.Threading.Tasks;
using UnityEngine;

public class TestClass {

    private void Start() {
        Task.Factory.StartNew(ActionTest);
        Task.Factory.StartNew(FuncTest);
    }

    private void ActionTest() {

    }

    private int FuncTest() {
        return 0;
    }
}

 

* Action/callback ์˜ˆ์‹œ

using System;
using UnityEngine;

public class TestScript : MonoBehaviour
{
    private void Start(){
        TestCallback((result) => Debug.Log("result : " + result));
    }

    private void TestCallback(Action<string> callback){
        callback("callback!");
    }
}

callback ์€ ํ–‰๋™์ด ๋๋‚ฌ์„ ๋•Œ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ.

์ฝœ๋ฐฑ ํ›„ ์ˆ˜ํ–‰ํ•  ๋‚ด์šฉ์€ ์œ„์ฒ˜๋Ÿผ ๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๊น”๋”ํ•˜๋‹ค.

728x90