🔍 비동기(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"
'유니티' 카테고리의 다른 글
[Lightshot] 스크린샷 무료앱 - 네모박스, 글쓰기 (0) | 2025.02.18 |
---|---|
노래 AI (1) | 2025.02.18 |
System.Action을 사용해야 하는 경우와 비동기 호출과의 차이점 (0) | 2025.02.18 |
C# string 주요기능 (0) | 2025.02.17 |
[UNITY] Mathf 주요 기능 정리 (Unity 수학 라이브러리) (0) | 2025.02.17 |