본문 바로가기
유니티

System.Action을 사용해야 하는 경우와 비동기 호출과의 차이점

by 유니티세상 2025. 2. 18.

🔍 System.Action을 사용해야 하는 경우와 비동기 호출과의 차이점

System.Action은 매개변수를 가질 수 있지만 반환 값이 없는 델리게이트(delegate) 타입이야.
즉, 특정 메서드를 콜백(callback)으로 전달할 때 유용하게 사용돼.


1️⃣ System.Action을 사용해야 하는 경우

✅ 1. 콜백(callback) 함수로 사용

  • 어떤 이벤트가 발생한 후 특정 동작을 실행해야 할 때
  • 주로 UI 이벤트, 작업 완료 후 실행할 코드 등을 전달할 때 사용
void DoSomething(Action callback)
{
    Console.WriteLine("작업 실행 중...");
    callback?.Invoke();  // 콜백 실행
}

DoSomething(() => Console.WriteLine("작업 완료!"));

💡 Action을 이용해 함수 실행 후 콜백을 호출하는 방식


✅ 2. 매개변수로 동작(함수)을 전달할 때

  • 특정 로직을 재사용하면서, 실행할 내용을 바꿀 때 유용
void ExecuteAction(Action action)
{
    Console.WriteLine("동작 시작...");
    action();
    Console.WriteLine("동작 끝!");
}

ExecuteAction(() => Console.WriteLine("특정 동작 수행"));

💡 ExecuteAction은 동작을 실행할 뿐, 어떤 동작인지 알 필요 없음
💡 즉, 원하는 동작을 Action으로 전달하면 됨


✅ 3. 이벤트 핸들러와 함께 사용

  • 특정 이벤트 발생 시 실행할 코드를 동적으로 할당할 수 있음
Action onClick;

void ButtonClick()
{
    onClick?.Invoke(); // 등록된 이벤트 실행
}

onClick = () => Console.WriteLine("버튼 클릭됨!");
ButtonClick(); // 버튼 클릭됨!

💡 버튼 클릭 시 실행할 동작을 Action으로 등록해서 유연하게 관리 가능


2️⃣ 비동기 호출과 Action의 차이

Action을 사용하는 것과 비동기(Async/Await, Task) 방식을 사용하는 것은 차이가 있어.

비교 항목 Action (콜백) 비동기 호출 (Async/Await)

실행 방식 즉시 실행(동기) 병렬로 실행(비동기)
흐름 제어 함수가 실행되면 callback.Invoke()로 직접 실행 await 키워드로 호출 후 결과 대기
주 사용 사례 이벤트, UI 처리, 콜백 함수 전달 네트워크 요청, 파일 I/O, 장시간 작업

콜백(Action) vs 비동기(Async/Await) 예제

1️⃣ Action을 이용한 콜백 방식

void DoSomething(Action callback)
{
    Console.WriteLine("작업 실행 중...");
    callback?.Invoke();
}

DoSomething(() => Console.WriteLine("콜백 실행됨!"));

💡 즉시 실행되므로 흐름을 블로킹(blocking)함


2️⃣ 비동기 Task를 이용한 방식

async Task DoSomethingAsync()
{
    Console.WriteLine("작업 실행 중...");
    await Task.Delay(2000); // 2초 대기 (비동기 작업)
    Console.WriteLine("비동기 작업 완료!");
}

await DoSomethingAsync();

💡 비동기 작업이 진행되는 동안 다른 작업 수행 가능!
💡 콜백 기반 Action보다 가독성이 좋고 관리가 쉬움


3️⃣ Action과 Task의 혼합 사용

  • 콜백 기반 코드도 비동기적으로 실행할 수 있음
  • Action을 비동기 코드에서 활용 가능
async Task ExecuteAsync(Action callback)
{
    Console.WriteLine("비동기 작업 실행 중...");
    await Task.Delay(2000);
    callback?.Invoke();
}

await ExecuteAsync(() => Console.WriteLine("비동기 작업 후 콜백 실행!"));

💡 비동기 작업 후 특정 동작을 실행해야 할 때 Action을 활용 가능


🎯 정리

  1. Action
    • 즉시 실행되는 콜백을 전달할 때 사용
    • 이벤트 핸들러, UI 이벤트 처리, 특정 작업 후 실행할 함수 전달에 유용
    • 흐름 제어가 단순하지만, 비동기 작업에는 적합하지 않음
  2. 비동기(Async/Await, Task)
    • 네트워크 요청, 파일 I/O, 장시간 작업에서 흐름을 블로킹하지 않도록 사용
    • await을 통해 흐름을 자연스럽게 유지 가능
  3. Action vs 비동기
    • 즉시 실행이 필요하면 Action
    • 병렬 실행이 필요하면 Task
    • 둘을 혼합하여 비동기 작업 후 콜백을 실행할 수도 있음

즉, 비동기로 처리할 필요가 없는 경우엔 Action을 사용하면 깔끔하고, 비동기가 필요하면 Task를 활용하면 된다! 🚀

'유니티' 카테고리의 다른 글

노래 AI  (1) 2025.02.18
비동기와 대리자의 차이  (0) 2025.02.18
C# string 주요기능  (0) 2025.02.17
[UNITY] Mathf 주요 기능 정리 (Unity 수학 라이브러리)  (0) 2025.02.17
unity TryParse, Parse  (0) 2025.02.17