일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- java
- 호이스팅
- 티스토리챌린지
- 리눅스
- DBMS
- JPA
- 차이점
- group by
- analytics4
- 명령어
- MariaDB
- Javascript
- mysql
- MongoDB
- Exception
- 자바
- PostgreSQL
- spring
- oracle
- git
- 오블완
- 인터페이스
- rsync
- SQL
- docker
- 추상클래스
- 트랜잭션
- mssql
- IntelliJ
- Linux
- Today
- Total
hanker
JavaScript - 실행 컨텍스트와 콜 스택(Call Stack) 본문
이번 글에서는 JavaScript의 동작 원리를 깊이 이해하는 데 필수적인 개념인 실행 컨텍스트(Execution Context)와 콜 스택(Call Stack)에 대해 다뤄보자.
이 개념을 이해하면 JavaScript의 호이스팅, 스코프, 클로저, 비동기 처리 등의 동작 방식을 보다 명확하게 파악할 수 있다.
1. 실행 컨텍스트란?
실행 컨텍스트(Execution Context)는 JavaScript 코드가 실행될 때 생성되는 환경을 의미한다.
코드가 실행되는 동안 변수, 함수, this의 값 등을 추적하며, JavaScript 엔진이 코드를 실행하는 방식을 결정한다.
* 실행 컨텍스트의 주요 역할 *
- 코드 실행을 위한 환경 생성
- 변수와 함수 선언 저장
- 스코프와 this를 관리
- 호이스팅 처리
2. 실행 컨텍스트의 종류
2-1. 전역 실행 컨텍스트 (Global Execution Context)
- 자바스크립트가 실행될 때 가장 먼저 생성됨
- 전역 객체 (window 또는 global)와 전역 변수, 전역 함수 포함
- 코드가 실행되기 전 자동으로 생성됨
- this는 기본적으로 전역 객체를 가리킴
2-2. 함수 실행 컨텍스트 (Function Execution Context)
- 함수가 호출될 때마다 생성됨
- 함수 내부의 변수, 매개변수, 내부 함수 등을 관리
2-3. Eval 실행 컨텍스트 (Eval Execution Context)
- eval() 함수가 실행될 때 생성됨 (보통은 사용을 지양한다)
3. 실행 컨텍스트 생성 과정 (메모리 구조)
실행 컨텍스트는 세 가지 단계를 거쳐 생성된다.
3-1. 생성 단계 (Creation Phase)
코드를 실행하기 전 메모리를 미리 할당하는 단계이다.
- 변수 선언 → undefined 할당 (var 키워드)
- 함수 선언 → 메모리에 전체 함수 저장
- this 값 설정
console.log(name); // undefined
var name = "Alice";
function sayHello() {
console.log("Hello!");
}
Execution Context:
----------------------
name → undefined
sayHello → function() {...}
this → window (브라우저)
3-2. 실행 단계 (Execution Phase)
코드를 한 줄씩 실행하며, 변수를 할당하고 함수 호출을 수행한다.
name = "Alice"; // 값 할당
sayHello(); // "Hello!" 출력
3-3. 종료 및 제거 (Destroy Phase)
- 함수 실행이 끝나면 해당 실행 컨텍스트가 콜 스택에서 제거된다.
- 전역 실행 컨텍스트는 페이지가 닫힐 때까지 유지된다.
4. 콜 스택(Call Stack)이란 ?
콜 스택은 실행 컨텍스트를 관리하는 관리하는 자료구조로, LIFO (Last-In, First-Out) 구조를 가진다.
* LIFO : 마지막에 실행된 함수가 가장 먼저 제거
콜 스택의 동작 방식
function first() {
console.log("First function");
second();
}
function second() {
console.log("Second function");
third();
}
function third() {
console.log("Third function");
}
first();
콜 스택의 변화를 보자.
1. first() 함수 호출 : first 실행 컨텍스트가 스택에 추가됨
2. second() 함수 호출 : second 실행 컨텍스트가 추가됨
3. third() 함수 호출 : third 실행 컨텍스트가 추가됨
4. third() 실행 완료 → 제거
5. second() 실행 완료 → 제거
6. first() 실행 완료 → 제거
5. 실행 컨텍스트와 비동기 처리
자바스크립트는 싱글 스레드(Single Thread) 환경에서 비동기 처리를 수행해야 한다
(* 자바스크립트는 싱글 스레드 기반 언어로, 한 번에 하나의 작업만을 처리할 수 있다. 이로 인해 시간이 오래 걸리는 작업이 실행되면 다른 작업들이 대기해야 하는 문제가 발생해서 비동기 처리로 수행해야 한다.)
이때 콜 스택과 이벤트 루프가 협력하여 비동기 처리를 관리한다.
* 이벤트 루프 : 싱글 스레드 환경에서 비동기 작업을 효율적으로 처리하기 위한 메커니즘
비동기 예제
console.log("Start");
setTimeout(() => {
console.log("Async Operation");
}, 2000);
console.log("End");
1. console.log("Start") 실행 → 콜 스택에서 제거
2. setTimeout() 실행 → Web API에 넘기고 즉시 제거
3. console.log("End") 실행 → 콜 스택에서 제거
4. 2초 후, 콜백 함수가 태스크 큐(Task Queue)에 추가
5. 이벤트 루프가 콜 스택이 비어있는지 확인 후 실행
실행 결과
Start
End
Async Operation
정리
개념 | 설명 |
실행 컨텍스트 | 코드 실행 환경을 정의 (변수, 함수, this 포함) |
콜 스택 | 실행 컨텍스트를 관리하는 LIFO 구조의 스택 |
호이스팅 | 변수와 함수 선언이 실행 컨텍스트 생성 단계에서 메모리에 할당됨 |
이벤트 루프 | 콜 스택과 Web API(Task Queue)를 연결하여 비동기 코드 실행 |
비동기 처리 | Web API, 태스크 큐, 이벤트 루프가 협력하여 수행한다. 콜 스택이 비워져야 비동기 콜백이 실행된다. |
끝.
'JavaScript' 카테고리의 다른 글
JavaScript - 비동기 프로그래밍 (Promise, async / await) (0) | 2025.02.08 |
---|---|
JavaScript - this 키워드 (현재 실행 중인 환경에 따라 다른 객체를 참조) (1) | 2025.01.30 |
JavaScript - 호이스팅(Hoisting) (0) | 2025.01.29 |
JavaScript - 스코프(Scope)와 클로저(Closure) (0) | 2024.12.27 |
JavaScript - JavaScript의 디버깅과 개발 도구 활용 (1) | 2024.12.21 |