JavaScript는 단일 스레드 언어이므로 한 번에 하나만 실행할 수 있다.
그러나 다른 코드가 계속 실행되는 동안 코드가 백그라운드에서 실행될 수 있는 비동기 프로그래밍도 지원한다.
이는 JavaScript의 두 가지 주요 기능인 메시지 큐와 이벤트 루프 때문에 가능하다.
1. 메시지 큐
메시지 큐는 처리해야 하는 메시지(또는 작업)의 목록이다.
대기열의 각 메시지는 메시지가 처리될 때 실행될 함수와 연결된다.
메시지는 대기열에 추가된 순서, 즉 FIFO(First In, First Out) 순서대로 실행된다.
2. 이벤트 루프
이벤트 루프는 대기열의 메시지 처리를 담당한다. 아래의 과정을 반복한다.
백그라운드에서 계속 실행되어 처리할 새 메시지의 대기열을 확인한다. > 메시지가 발견되면 관련 기능이 실행된다.
이벤트 루프는 계속 실행되어 처리할 메시지가 더 이상 남지 않을 때까지 새 메시지의 대기열을 확인한다.
3. 예시
console.log("Start");
setTimeout(() => {
console.log("3 seconds have passed");
}, 3000);
console.log("End");
/* 출력 결과
Start
End
3 seconds have passed
*/
위의 예에서 console.log 문은 동기식으로 실행되고 호출 스택에 추가된다.
setTimeout 함수를 만나면 메시지 큐에 추가된다.
console.log("End") 문이 실행된 후 호출 스택이 비어 있고 이벤트 루프가 메시지 큐를 확인한다.
setTimeout 메시지를 찾고 지정된 지연 후에 콜백 함수를 호출 스택에 추가한다.
이제 메시지 대기열이 비어 있고 이벤트 루프가 계속 실행되어 새 메시지를 확인한다.
요약하면 메시지 대기열과 이벤트 루프는 JavaScript가 비동기 코드 실행을 처리하는 방법을 이해하는 데 중요한 개념이다.
메시지 큐는 실행 대기 중인 메시지를 저장하고 이벤트 루프는 메시지 큐를 지속적으로 확인하고 호출 스택이 비어 있으면 큐의 다음 메시지를 실행한다.
'개발 언어 > 자바스크립트 33가지 개념' 카테고리의 다른 글
[JavaScript 33가지 개념] 11. 자바스크립트 엔진 (1) | 2024.10.25 |
---|---|
[JavaScript 33가지 개념] 10. setTimeout, setInterval, requestAnimationFrame (0) | 2023.03.12 |
[JavaScript 33가지 개념] 08. IIFE, Modules, Namespaces (0) | 2023.03.02 |
[JavaScript 33가지 개념] 07. 함수 표현식(expression) vs 함수 선언문(declaration) (0) | 2022.12.08 |
[JavaScript 33가지 개념] 06. 함수 범위, 블록 범위, 렉시컬(lexical) 범위 (0) | 2022.06.06 |
댓글