Call Stack

귤녹차·2025년 2월 3일
post-thumbnail

1️⃣ 콜 스택(Call Stack)

call은 함수의 call에서 call, 즉 함수의 호출을 의미한다. 스택은 자료 구조의 큐와 스택에서 스택을 의미한다.

함수가 실행되기 위해서는 함수를 메모리에 먼저 올리게 된다. 이때 함수의 호출 관련 정보들이 스택 구조에 쌓이게 된다. 이 곳이 함수를 사용할 때마다 그와 관련된 정보들이 쌓이는 곳, 콜 스택(Call Stack)이다.

2️⃣ 특징

  • 함수 호출 정보를 저장하는 스택 구조이다.
  • LIFO(Last In, First Out) 원칙으로 작동한다.
  • 각 함수 호출마다 실행 컨텍스트 생성 및 저장된다.

3️⃣동작 방식

추가 - 함수 호출 시 해당 함수의 실행 컨텍스트가 스택에 추가(push) 된다.

제거 - 함수 실행 완료 시 해당 컨텍스트가 스택에서 제거(pop) 된다.

중첩 함수 - 중첩 함수 호출 시 호출 순서대로 스택에 쌓이게 된다. 예를 들어 함수가 A1 → A2 → A3로 연결되어 있다면, A3가 가장 처음 스택에 추가, 이후로 A2, A1가 추가 된다.

4️⃣ 스택 프레임 (stack frame)

함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장된다. 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다. 각 함수는 실행될 때마다 스택에 새로운 스택 프레임을 쌓고, 함수 실행이 끝나면 해당 프레임은 스택에서 제거된다.

스택 프레임의 정보는 스코프(scope)와 관련이 있다. 스코프는 함수 실행 시 그 함수에서 접근할 수 있는 변수나 함수의 범위를 의미하며, 각 함수 호출에 대한 실행 정보를 담고 있는 스택 프레임을 이해하는 데 중요한 역할을 한다.

4️⃣-1️⃣ 스코프(scope)

스코프는 코드 내에서 변수, 함수, 객체 등이 유효한 범위를 의미한다.

스코프의 종류:

전역 스코프 (Global Scope): 코드의 가장 바깥 영역에서 선언된 변수로 어디서든 접근할 수 있다.

함수 스코프 (Function Scope): 함수 내에서 선언된 변수는 해당 함수 내에서만 접근할 수 있다.

블록 스코프 (Block Scope): let이나 const로 선언된 변수는 블록(중괄호) 내에서만 유효하다.

4️⃣-2️⃣ 스코프 체인 (Scope Chain)

스코프 체인은 중첩된 함수에서 외부 함수의 변수에 접근할 수 있도록 하는 메커니즘이다. 함수가 호출될 때마다 스코프 체인이 생성되고 현재 함수 스코프에서 시작해 상위 함수 스코프까지 차례로 탐색하면서 변수에 접근한다.

스코프 체인의 동작 방식

  1. 함수가 호출되면, 해당 함수의 스코프상위 스코프들이 결합된 스코프 체인이 형성된다.
  2. 함수 내에서 변수를 찾을 때, 먼저 현재 함수의 스코프에서 찾고, 찾지 못하면 상위 함수의 스코프로 올라가며 찾는다.
  3. 최상위에 도달할 때까지 변수나 함수가 없다면, 전역 스코프에서 찾는다.

4️⃣-3️⃣ 스택 프레임과 스코프, 스코프 체인의 관계

  • 스택 프레임과 스코프:
    • 스택 프레임은 함수가 호출될 때 생성되는 메모리 영역으로, 그 함수에 필요한 매개변수, 지역 변수, 실행 컨텍스트 등의 정보를 담고 있다.
    • 스코프는 코드에서 변수나 함수에 접근할 수 있는 범위를 의미하는데, 함수가 호출될 때 그 함수의 스코프와 관련된 정보가 스택 프레임에 저장이 된다. 즉, 함수 실행 시 변수나 매개변수 등은 스택 프레임에 저장되며, 이 정보는 그 함수의 스코프에 포함된다.
  • 스코프 체인과 스택 프레임 간 연결:
    • 함수가 호출될 때마다 스코프 체인이 형성된다. 이는 현재 함수 스코프에서부터 시작해 상위 함수 스코프까지 차례로 검색할 수 있게 한다.
    • 각 함수 호출 시 생성된 스택 프레임스코프 체인을 통해 서로 연결된다. 예를 들어, 내부 함수에서 외부 함수의 변수에 접근할 때, 스코프 체인이 상위 함수의 스택 프레임을 참조하며 접근하게 된다.

5️⃣ 에러 버블링과 콜 스택

에러 버블링은 함수에서 발생한 에러가 콜 스택을 따라 상위 함수로 전파되는 현상이다.

위의 사진에서는 F4에서 발생한 에러가 상위 함수로 전파되고 있고 이를 상위 함수 F2에서 에러 포착을 하는 것을 나타내고 있다.

이는 에러를 포착하는 함수가 중간에 존재하지 않다면 포착되지 않은 에러는 스택 최상위까지 전파 되어 프로그램이 중단 될 수 있음을 의미한다. 이러한 상황을 방지하기 위하여 적절한 에러 처리 로직을 가질 수 있도록 해야한다.

profile
배우는 과정에 즐거움을 느끼고 있습니다.

0개의 댓글