동기(Synchronous)
- 정의: 작업이 시작과 끝을 맞춰 순차적으로 실행되는 방식.
- 특징:
- 호출 프로세스는 하부 작업이 완료될 때까지 실행을 멈춤.
- 작업 순서와 흐름이 예측 가능.
- 장점:
- 코드의 가독성이 좋고, 이해하기 쉬움.
- 데이터 일관성을 유지하기 쉬움.
- 단점:
- 하부 작업이 오래 걸릴 경우 전체 프로세스가 지연됨.
- 예시 코드:
Console.WriteLine("Start");
DoWork(); // 하부 작업이 완료될 때까지 기다림.
Console.WriteLine("End");
비동기(Asynchronous)
- 정의: 작업의 완료 여부와 상관없이 다른 작업을 진행할 수 있는 방식.
- 특징:
- 호출 프로세스는 하부 작업의 실행 여부와 관계없이 실행을 계속함.
- 작업 순서가 보장되지 않을 수 있음.
- 장점:
- 작업 병렬 처리가 가능하며 시스템 자원을 효율적으로 사용.
- 긴 작업으로 인한 블로킹을 방지.
- 단점:
- 디버깅과 코드 작성이 복잡.
- 데이터 동기화 문제가 발생할 가능성.
- 예시 코드 (Async/Await):
Console.WriteLine("Start");
await DoWorkAsync(); // 하부 작업 완료를 기다리는 동안 다른 작업 가능.
Console.WriteLine("End");
비동기 프로그래밍의 주요 특징
- 작업 병렬 처리
- 비동기 방식은 메인 스레드가 블로킹되지 않고, 추가적인 작업을 별도 스레드에서 처리하므로 사용자 인터페이스(UI)가 멈추지 않고 원활히 작동합니다.
- 예를 들어, 파일 다운로드와 같은 네트워크 작업을 비동기 방식으로 처리하면, 사용자는 작업이 끝날 때까지 기다리지 않고 프로그램의 다른 기능을 사용할 수 있습니다.
- 비용 절감 및 성능 최적화
- 비동기 방식은 리소스를 효율적으로 관리하며, 특히 많은 IO 작업을 처리하는 시스템에서 CPU 유휴 시간을 줄여줍니다.
비동기 호출과 상태 관리
비동기 호출의 핵심은 콜백과 작업 상태 관리입니다. 작업 완료 후 호출되는 콜백 함수나 Promise 객체를 활용하여 호출 흐름을 관리합니다. 아래는 다양한 비동기 처리 방식과 상태 관리 예제입니다.
1) 콜백(callback)
- 비동기 작업이 완료되면, 등록된 콜백 함수가 실행됩니다.
- 콜백 지옥(Callback Hell)을 방지하기 위해 코드 구조를 단순화하는 추가 도구들이 활용됩니다.
void PerformTaskWithCallback(Action callback)
{
// 비동기 작업 수행
Console.WriteLine("작업을 시작합니다...");
Task.Delay(2000).Wait(); // 2초 지연
callback();
}
// 사용 예시
PerformTaskWithCallback(() =>
{
Console.WriteLine("비동기 작업 완료!");
});
2) Promise 및 Task 객체
- 비동기 작업의 성공 및 실패를 다룰 수 있는 더 체계적인 방법입니다.
- .NET의 Task와 JavaScript의 Promise는 대표적인 구현 예입니다.
Task<string> PerformTaskAsync()
{
return Task.Run(() =>
{
Task.Delay(2000).Wait(); // 2초 지연
return "작업 완료!";
});
}
// 사용 예시
async Task RunAsyncTask()
{
var result = await PerformTaskAsync();
Console.WriteLine(result); // 출력: 작업 완료!
}
Async/Await의 등장과 활용
Async/Await 키워드는 비동기 프로그래밍의 복잡성을 줄이고 코드의 가독성을 높이는 데 중요한 역할을 합니다.
- 가독성 향상
- 복잡한 콜백 체인을 단순화하여 순차적 논리처럼 작성할 수 있습니다.
- 동기 코드처럼 작성 가능
- 비동기 작업이 마치 동기적으로 실행되는 것처럼 보이도록 작성할 수 있습니다.
async Task<string> FetchDataFromServerAsync()
{
Console.WriteLine("데이터를 가져오는 중...");
await Task.Delay(3000); // 3초 지연
return "서버 응답 데이터";
}
async Task MainAsync()
{
var data = await FetchDataFromServerAsync();
Console.WriteLine(data); // 출력: 서버 응답 데이터
}
주요 차이점
특징동기(Synchronous)비동기(Asynchronous)
실행 순서 | 순차적 | 비순차적 (병렬 가능) |
흐름 제어 | 작업 완료 후 다음 작업 실행 | 작업 중에도 다른 작업 실행 가능 |
응답성 | 느림 | 빠름 |
복잡성 | 낮음 | 높음 |
자원 사용 효율성 | 비효율적 | 효율적 |
활용 사례
- 동기:
- 데이터베이스 트랜잭션 처리.
- 사용자 입력 대기와 같은 경우.
- 비동기:
- 네트워크 요청 처리.
- 파일 다운로드 및 업로드.
- GUI 응답성 유지.
'소프트웨어 개발 및 시스템 프로그래밍' 카테고리의 다른 글
CMD(Window+R) 유용한 명령어 모음 (0) | 2024.12.15 |
---|---|
API (Application Programming Interface) (1) | 2024.12.14 |
WPF (Windows Presentation Foundation) (0) | 2024.12.14 |
.NET Framework 개요 (0) | 2024.12.14 |
소프트웨어 아키텍처란 (0) | 2024.12.14 |