
목 차
1.콜스택의 정의 및 역할
2.콜스택의 동작 원리
3.콜스택과 함수 호출
4.콜스택의 한계: 스택 오버플로우
5.콜스택과 비동기 처리
6.콜스택과 실행 컨텍스트
7.콜스택과 메모리 관리
8.고급 개념: 콜스택과 스코프 체인

★자바스크립트(JS)
자바스크립트 엔진이 함수 호출을 추적하고 관리하는 데 사용되는 자료구조입니다.
'콜스택'은 프로그램에서 우리가 어디쯤에 위치하고 있는지를 기본적으로 기록하는 데이터 구조입니다.
'콜스택'은 프로그램에서 "메서드(함수) 호출을 추적하는 메모리 영역"이라고 할 수 있습니다.




1.함수 호출:
2.함수 실행:
3.함수 반환:
4.스택이 비면:
public class CallStack {
public static void main(String[] args) {
System.out.println("main() 호출");
first();
System.out.println("main() 종료");
}
public static void first() {
System.out.println("first() 호출");
second();
System.out.println("first() 종료");
}
public static void second() {
System.out.println("second() 호출");
third();
System.out.println("second() 종료");
}
public static void third() {
System.out.println("third() 호출");
System.out.println("Hello from third()");
System.out.println("third() 종료");
}
}
@위의 코드 실행결과.
main() 호출
first() 호출
second() 호출
third() 호출
Hello from third()
third() 종료
second() 종료
first() 종료
main() 종료
1.처음 main() 메소드가 호출되고
2.main() 내부에서 first()가 호출되고
3.first() 내부에서 second()가 호출되고
4.second() 내부에서 third()가 호출됩니다.
.
그리고 third() 메소드의 실행이 완료되면서부터 역순으로
1.third()가 종료되어 스택에서 제거되고
2.second()가 종료되어 스택에서 제거되고
3.first()가 종료되어 스택에서 제거되고
4.마지막으로 main()이 종료되어 스택에서 제거됩니다.
이것이 바로 콜스택의 LIFO(Last In First Out) 구조를 보여줍니다.

콜스택은 함수 호출의 순서를 관리하여 코드의 흐름을 제어합니다.
function foo() {
console.log('foo start');
bar();
console.log('foo end');
}
function bar() {
console.log('bar');
}
foo();
1.foo()가 호출되면 콜스택에 추가됩니다.
2.foo() 내에서 bar()가 호출되면 bar()가 콜스택에 추가됩니다.
3.bar()가 반환되면 콜스택에서 제거됩니다.
4.foo()가 반환되면 콜스택에서 제거됩니다.

콜스택은 함수 호출을 기록하는 자료구조로, 한정된 크기를 가지고 있습니다.
이는 주로 재귀 함수에서 발생하며, 함수가 자신을 호출하는 데 종료조건이 없을 때 발생합니다.
1.재귀 함수의 종료 조건 부족:
2.함수 호출의 깊이:
function recursive() {
recursive(); // 종료 조건이 없으면 스택 오버플로우 발생
}
recursive();

1.종료 조건 추가:
2.반복문 사용:
3.메모이제이션:
4.setTimeout 사용:
function recursive(i) {
if (i >= 5) return; // 종료 조건
recursive(i + 1);
}
recursive(1);

위에서 자바스크립트는 '단일 스레드' 언어로, 스택 상에서 한번에 하나의 작업만 처리할 수 있다고 했습니다.
그러나, '비동기 처리' 방법을 통해 '콜스택'의 한계를 극복하고, 여러 작업을 동시에 처리하는 것처럼 보이게 할 수 있습니다.
비동기 처리는 '콜스택'을 차지하지 않고 다른 작업을 수행할 수 있도록 하여, 더 효율적인 코드를 만들어줍니다.

1.블로킹 방지:
2.효율적인 자원 활용:
setTimeout(() => {
console.log('비동기 처리');
}, 1000);
console.log('동기 처리');
setTimeout 함수는 비동기적으로 실행됩니다. 이는 콜백 함수를 메시지 큐에 추가합니다.
console.log('동기 처리')는 즉시 실행됩니다.
이벤트 루프가 콜스택이 비었을 때 메시지 큐의 콜백 함수를 실행합니다.

콜백 함수의 실행:
콜스택의 비움:

1.Promise:
2.async/await:
3.setTimeout, setInterval:
이러한 비동기 처리 기술을 통해 콜스택의 한계를 극복하고, 더 효율적인 코드를 작성할 수 있습니다.

실행 컨텍스트는 자바스크립트 코드가 실행되는 환경을 의미합니다.
이는 함수의 변수, 스코프 체인, this 등의 정보를 포함하여
코드가 실행되기 위한 모든 필요한 데이터를 제공합니다.
실행 컨텍스트는 두 가지 주요 단계로 나뉩니다:
생성 단계 (Creation Phase):
실행 단계 (Execution Phase):

콜스택은 실행 컨텍스트를 관리하는 자료구조입니다.
콜스택은 Last-In-First-Out (LIFO) 원칙에 따라 작동하며,
함수가 호출될 때마다 새로운 실행 컨텍스트가 생성되어 콜스택에 추가됩니다.
함수 호출:
함수 실행:
함수 반환:
function foo() {
console.log('foo start');
bar();
console.log('foo end');
}
function bar() {
console.log('bar');
}
foo();
.
1.foo()가 호출되면 foo의 실행 컨텍스트가 콜스택에 추가됩니다.
2.foo() 내에서 bar()가 호출되면 bar의 실행 컨텍스트가 콜스택에 추가됩니다.
3.bar()가 반환되면 bar의 실행 컨텍스트가 콜스택에서 제거됩니다.
4.foo()가 반환되면 foo의 실행 컨텍스트가 콜스택에서 제거됩니다.


JS의 '메모리 관리'는 '스택'과 '힙'이라는 두 가지 주요 메모리 공간을 통해서 이루어집니다.
콜스택은 메모리 관리에도 중요한 역할을 합니다.

function foo() {
var obj = { // obj는 힙에 저장되며, 참조는 스택에 저장됩니다.
name: "John",
age: 30
};
console.log(obj.name); // obj 참조를 통해 힙의 데이터에 접근합니다.
}
foo(); // foo가 반환되면 obj 참조가 해제됩니다.

콜스택은 함수 호출을 기록하는 자료구조로,
Last-In-First-Out (LIFO) 원칙에 따라 작동합니다.
함수가 호출되면 새로운 실행 컨텍스트가 생성되어 콜스택에 추가됩니다.
콜스택의 역할.
함수 호출 추적: 콜스택은 함수 호출의 순서를 기록합니다.
실행 컨텍스트 관리: 각 함수의 실행 컨텍스트를 관리하여 코드의 흐름을 제어합니다.

변수 객체 (Variable Object):
스코프 체인 (Scope Chain):
this 객체:
1.생성 단계 (Creation Phase):
2.실행 단계 (Execution Phase):



function outer() {
var x = 10;
return function inner() {
console.log(x); // inner는 outer의 스코프 체인을 기억합니다.
};
}
var closure = outer();
closure(); // outer가 반환된 후에도 x에 접근할 수 있습니다.
outer()가 호출되면 outer의 실행 컨텍스트가 콜스택에 추가됩니다.
inner() 함수가 반환되면 outer의 스코프 체인이 기억됩니다.
closure()가 호출되면 inner() 함수가 outer의 스코프 체인을 통해 x에 접근합니다.

콜스택과 스코프 체이닝은 자바스크립트의 코드 실행을 관리하는 데 중요한 역할을 합니다. - 콜스택은 함수 호출을 기록하는 자료구조로, 각 함수의 실행 컨텍스트를 관리합니다.
함수 호출:
스코프 체인 생성:
변수 접근:
function outer() {
var x = 10; // x는 outer의 스코프에 있습니다.
function inner() {
console.log(x); // inner는 outer의 스코프 체인을 통해 x에 접근합니다.
}
inner();
}
outer();
