본문 바로가기
유니티

비동기와 대리자의 차이

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

🔍 비동기(Async/Await)와 대리자(Delegate)의 차이

비동기(Async/Await)와 대리자(Delegate)는 모두 함수를 실행하는 방식에 관련되어 있지만, 목적과 동작 방식이 다름.


1️⃣ 대리자(Delegate)란?

대리자(Delegate)함수를 가리키는 참조 타입으로, 콜백을 전달하거나 특정 동작을 실행할 함수의 주소를 저장하는 데 사용돼.
즉, 함수를 변수처럼 다룰 수 있도록 하는 기능이야.

// 1. 대리자 선언
delegate void MyDelegate(string message);

// 2. 대리자를 사용한 함수 정의
void PrintMessage(string message)
{
    Console.WriteLine(message);
}

// 3. 대리자 인스턴스 생성 후 함수 할당
MyDelegate del = PrintMessage;

// 4. 대리자 호출
del("Hello, Delegate!");

📌 출력 결과

Hello, Delegate!

대리자의 핵심 역할

  • 함수를 변수처럼 전달할 수 있음
  • 특정 이벤트가 발생했을 때 미리 지정한 함수를 실행하는 용도로 사용됨
  • 여러 개의 함수를 체인처럼 연결해 실행할 수도 있음 (Multicast Delegate)

2️⃣ 비동기(Async/Await)란?

비동기(Async/Await)작업이 완료될 때까지 기다리지 않고, 다른 작업을 병렬적으로 실행하는 방식이야.
즉, 시간이 오래 걸리는 작업(네트워크, 파일 I/O, DB 처리 등)을 수행할 때 주 쓰임.

async Task PrintMessageAsync(string message)
{
    await Task.Delay(1000); // 1초 대기 (비동기 작업)
    Console.WriteLine(message);
}

// 비동기 실행
await PrintMessageAsync("Hello, Async!");

📌 출력 결과 (1초 후 출력됨)

Hello, Async!

비동기의 핵심 역할

  • 실행 흐름을 멈추지 않고(non-blocking) 다른 작업을 동시에 실행
  • await 키워드를 사용해 비동기 작업이 끝날 때까지 기다릴 수 있음
  • CPU 작업과 네트워크/디스크 I/O 작업을 효율적으로 분리 가능

3️⃣ 대리자(Delegate)와 비동기(Async/Await)의 차이점

비교 항목 대리자(Delegate)   비동기(Async/Await)
기본 개념 함수를 가리키는 참조 타입 (콜백 개념) 작업이 끝날 때까지 기다리지 않고 실행
주 사용 목적 함수를 변수처럼 전달하여 나중에 실행 시간 오래 걸리는 작업을 효율적으로 수행
코드 실행 방식 즉시 실행 (동기적) 또는 명시적으로 호출해야 함 비동기적으로 실행 (다른 작업과 병렬 실행 가능)
흐름 제어 특정 이벤트에서만 실행됨 (수동적) await 키워드로 제어 가능 (자동 대기)
주요 사용 사례 콜백 함수, 이벤트 핸들러, 함수 포인터 대체 네트워크 요청, 파일 I/O, 병렬 처리

4️⃣ 대리자와 비동기의 차이를 코드로 이해하기

✅ 1. 대리자를 이용한 동기 실행 (콜백 패턴)

delegate void ProcessDelegate(string message);

void ProcessTask(ProcessDelegate callback)
{
    Console.WriteLine("작업 시작...");
    callback("작업 완료!");
}

ProcessTask(message => Console.WriteLine(message));

📌 출력 결과

작업 시작...
작업 완료!

💡 이 코드는 즉시 실행됨 (동기적)
💡 작업이 끝난 후 콜백 함수를 직접 호출하는 방식


✅ 2. 비동기(Async/Await)를 이용한 비동기 실행

async Task ProcessTaskAsync()
{
    Console.WriteLine("작업 시작...");
    await Task.Delay(2000);  // 2초 대기
    Console.WriteLine("작업 완료!");
}

// 비동기 실행
await ProcessTaskAsync();

📌 출력 결과 (2초 후 실행됨)

작업 시작...
(2초 후)
작업 완료!

💡 이 코드는 비동기적으로 실행됨
💡 2초 동안 기다리는 동안 다른 작업을 수행할 수 있음


5️⃣ 대리자와 비동기를 혼합하여 사용하기

  • 대리자를 활용하여 비동기 작업이 완료된 후 특정 콜백을 실행할 수도 있음.
delegate void TaskCompletedDelegate(string message);

async Task ProcessTaskAsync(TaskCompletedDelegate callback)
{
    Console.WriteLine("작업 시작...");
    await Task.Delay(2000);
    callback("작업 완료!");
}

// 비동기 실행 후 콜백 호출
await ProcessTaskAsync(message => Console.WriteLine(message));

📌 출력 결과

작업 시작...
(2초 후)
작업 완료!

💡 비동기 작업이 끝난 후, 대리자를 통해 특정 함수를 호출함
💡 이벤트 기반 비동기 처리를 대리자와 함께 사용할 수 있음


🎯 결론

 

대리자(Delegate)  비동기(Async/Await)
함수를 가리키는 참조 타입 비동기 작업을 실행하는 방식
즉시 실행되거나 이벤트에서 호출됨 작업이 끝날 때까지 기다리지 않고 실행
콜백 패턴을 구현할 때 사용 네트워크, 파일 I/O 같은 장기 작업에 적합
동기적으로 실행됨 (기본적으로 멈추지 않음) await로 비동기 실행 가능 (병렬 작업 가능)
함수를 전달하여 유연한 코드 작성 가능 비동기 흐름을 깔끔하게 제어 가능

즉,

  • "함수를 변수처럼 전달하고 싶으면 Delegate"
  • "작업이 오래 걸릴 경우 Async/Await"
  • "비동기 후 특정 함수를 실행하고 싶다면 Delegate + Async"