동기
- 동기 방식은 스레드를 이용하여 코드가 작성된 순서대로 작업을 처리한다.
⇒ 문제점 : 하나의 작업이 오래 걸리면, 모든 작업이 끝나는 데 걸리는 전반적인 시간이 늘어난다.
ex) 웹사이트에서 버튼 하나하나마다 30초 씩 걸린다고 생각해보자
멀티스레드
- 자바스크립트에서는 멀티스레드 기능이 없고 싱글스레드로만 동작한다.
비동기
- 비동기 방식은 작업이 끝나든말든 여러 개의 작업을 동시에 실행시키는 것이다.
⇒ 동시에 다 실행시키면 각 작업들이 정상적으로 끝났는지 어떻게 아는가?
: 각각의 작업들에게 콜백함수를 붙인다.
콜백함수
- 동기적 방식으로 바꾸면
- setTimeout함수의 매개변수는 콜백함수와 delaytime
- 2000ms 뒤에 첫번째 인자인 콜백함수를 실행시킨다.
- 비동기적으로 실행되어 “코드 끝”이 먼저 실행되고 “A task END”가 실행된다.
예시 01)
- 비동기처리의 결과값을 이와같이 콜백함수를 이용하여 전달할 수 있다.
예시 02)
- 작업이 작성된 순서대로 수행되는 것이 아니라 비동기적으로 수행되는 것을 볼 수 있다.
예시 03)
- 위의 예제와 마찬가지로 delay time이 작은 순서대로 수행된다.
자바스크립트 엔진은 어떻게 동기적인 코드와 비동기적인 코드를 구분할까?
- 자바스크립트 코드들은 웹브라우저에 탑재된 JS Engine을 이용해 해석되고 실행된다.
- JS Engine : Heap과 Call Stack으로 구성됨
- Heap : 메모리 할당
- Call Stack : 코드 실행
- Main Context가 들어오는 순간이 프로그램이 시작되는 순간이고, Main Context가 나가는 순간이 프로그램이 종료되는 순간이다.
- 스레드는 Call Stack 하나만을 담당한다. (그림에서 보이는 것과 같이 Call Stack이 하나이므로 자바스크립트가 싱글스레드로 작동하는 것이다.)
- Event Loop는 Call Stack에 Main Context를 제외한 다른 함수가 남아있는지 아닌지를 계속 확인한다.
- 만약 다른 함수가 남아있지 않다면 콜백함수를 수행할 수 있으므로 콜백함수 cb를 Callback Queue로부터 넘겨서 Call stack에 놓는다.
예시 04)
'프론트엔드 > Java Script' 카테고리의 다른 글
JavaScript Sec 02_9 async & await - 직관적인 비 동기 처리 코드 작성하기 (0) | 2024.02.20 |
---|---|
JavaScript Sec 02_8 Promise - 콜백 지옥에서 탈출하기 (0) | 2024.02.20 |
JavaScript Sec 02_6 Spread 연산자 (0) | 2024.02.20 |
JavaScript Sec 02_5 비 구조화 할당 (구조 분해 할당) (0) | 2024.02.20 |
JavaScript Sec02_4 조건문 Upgrade (0) | 2024.02.20 |