본문 바로가기
자바스크립트

[자바스크립트] 콜스택 (Call stack)

by 세바개님 2023. 3. 9.

자바스크립트에서 함수를 호출할 때, 이를 호출 스택(Call Stack)에 쌓아놓고 실행합니다. 호출 스택은 함수 호출의 순서를 기억하며, 스택의 맨 위에 있는 함수가 현재 실행되고 있습니다. 함수가 실행을 완료하면, 스택에서 제거됩니다.

 

1. 코드 예시


예를 들어, 다음과 같은 코드가 있다고 가정해보겠습니다.

 

function greet(name) {
  console.log(`Hello, ${name}!`);
}

function sayHello() {
  const name = "John";
  greet(name);
  console.log("Finished saying hello.");
}

sayHello();


위 코드에서 sayHello 함수가 호출되면, 호출 스택에 sayHello 함수가 쌓입니다. 그리고 sayHello 함수 안에서 greet 함수가 호출되면, 호출 스택에 greet 함수도 쌓입니다. greet 함수가 실행을 완료하면, 호출 스택에서 제거됩니다. 그리고 sayHello 함수가 실행을 완료하면, 호출 스택에서도 제거됩니다.

따라서, 호출 스택은 현재 실행 중인 함수와 해당 함수가 호출한 함수의 순서를 추적합니다. 이를 통해 자바스크립트 엔진은 코드를 실행하는 데 필요한 정보를 기억하고 관리할 수 있습니다. 호출 스택은 자바스크립트의 실행 컨텍스트와 함께 사용되며, 실행 컨텍스트는 함수 호출에 필요한 정보를 추적하는 데 사용됩니다.

 

2. 스택 오버플로우

 

호출 스택은 제한된 메모리를 사용하므로, 콜스택이 꽉차면 스택 오버플로우(Stack Overflow) 에러가 발생합니다. 보통 다음과 같은 상황에서 발생합니다.

 

  1. 무한 재귀 호출: 함수가 자신을 계속 호출하면서 스택이 계속 쌓이고, 결국 스택이 가득 차서 오버플로우가 발생합니다.
  2. 너무 많은 함수 호출: 많은 함수가 호출되어 스택이 가득 차는 경우 스택 오버플로우가 발생할 수 있습니다.

스택 오버플로우는 예상치 못한 동작을 일으킬 수 있으며, 프로그램이 비정상적으로 종료될 수 있습니다. 따라서, 적절한 예외 처리나 코드 리팩토링 등의 조치를 취해야 합니다.

콜스택이 너무 많은 메모리를 사용하지 않도록, 가능한 한 깊은 함수 호출을 피하는 것이 좋습니다. 또한, 재귀 함수를 사용할 때는 종료 조건을 명시하여 무한 재귀 호출을 방지해야 합니다.

댓글