JavaScript와 같은 언어에서는 프로그래밍을 하면서 종종 중요한 개념들인 TDZ(Temporal Dead Zone)와 가비지 컬렉터(Garbage Collector)가 등장합니다. 이 두 가지는 각각 다른 목적을 가지고 있지만, 메모리 관리와 관련된 공통적인 특성을 공유하기 때문에 이 둘에 대해 잘 이해하는 것이 중요합니다. 이번 블로그 포스팅에서는 TDZ와 가비지 컬렉터가 무엇인지, 그 각각의 개념을 상세히 설명하고, 이들 간의 관계를 이해하는 데 도움을 줄 수 있도록 자세히 다뤄보겠습니다.
1. TDZ(Temporal Dead Zone):
1.1. TDZ의 정의
TDZ(Temporal Dead Zone)는 JavaScript에서 변수의 선언과 초기화 사이의 구간을 의미합니다. let, const, class로 선언된 변수는 그 선언 이전에 참조할 수 없으며, 이 구간에 접근하려고 할 때 ReferenceError가 발생합니다. TDZ는 코드의 실행 순서에 따른 변수의 유효성 문제로, 변수가 선언되기 전에 접근하는 경우를 방지하기 위한 메커니즘입니다.
1.2. TDZ의 동작 원리
JavaScript에서는 변수 선언이 호이스팅(hoisting)됩니다. 즉, var로 선언된 변수는 실제 코드 내 위치와 관계없이 변수 선언이 가장 상단으로 끌어올려져 실행됩니다. 그러나 let, const, class와 같은 변수들은 선언이 끌어올려지긴 하지만 초기화가 되지 않으면 TDZ에 존재하게 됩니다.
console.log(x); // ReferenceError: Cannot access 'x' before initialization let x = 10;
위의 코드에서 let x로 선언된 변수는 선언 이전에 접근하려고 하면 ReferenceError가 발생합니다. 이는 x가 TDZ에 있기 때문입니다. 즉, 변수 x는 선언 이후 초기화되기 전까지는 접근할 수 없는 상태로 존재하게 됩니다.
1.3. TDZ의 목적
TDZ의 주된 목적은 변수를 선언하기 전에 참조하거나 사용할 수 없도록 제한하여, 개발자가 오류를 쉽게 찾을 수 있도록 돕는 것입니다. 또한, 이를 통해 예기치 못한 버그를 방지할 수 있고, 변수 초기화 전 값을 참조하는 실수를 줄여줍니다.
2. 가비지 컬렉터(Garbage Collector):
2.1. 가비지 컬렉터의 정의
가비지 컬렉터(Garbage Collector)는 프로그래밍 언어에서 더 이상 사용되지 않는 객체나 메모리를 자동으로 관리하고 해제하는 시스템입니다. 메모리 관리의 중요한 기능으로, 프로그래머가 메모리 할당과 해제를 명시적으로 처리하지 않아도 되도록 도와줍니다. JavaScript를 비롯한 많은 언어에서는 이 메커니즘을 통해 메모리 누수를 방지하고, 효율적인 메모리 관리를 지원합니다.
2.2. 가비지 컬렉터의 동작 원리
가비지 컬렉터는 프로그램 실행 중 동적으로 메모리 할당과 해제를 자동으로 처리합니다. 주로 '참조 카운팅'과 '마크 앤 스윕(Mark-and-Sweep)' 알고리즘을 사용하여 더 이상 참조되지 않는 객체를 식별하고 메모리에서 해제합니다.
- 참조 카운팅(Reference Counting): 객체가 참조될 때마다 카운터가 증가하고, 참조가 끊기면 카운터가 감소합니다. 카운터가 0이 되면 객체를 가비지로 간주하고 메모리에서 해제합니다.
- 마크 앤 스윕(Mark-and-Sweep): 이 방식은 객체들이 더 이상 사용되지 않음을 확인하고 메모리에서 제거하는 방법입니다. 먼저, 살아 있는 객체들을 마크한 후, 살아 있지 않은 객체를 스윕(삭제)합니다.
2.3. 가비지 컬렉터의 주요 역할
- 자동 메모리 관리: 프로그래머가 명시적으로 메모리를 할당하거나 해제하지 않아도, 가비지 컬렉터가 자동으로 이를 관리하여 메모리 누수를 방지합니다.
- 효율성: 가비지 컬렉터는 필요 없는 메모리를 해제함으로써, 프로그램이 실행되는 동안 메모리 자원을 효율적으로 관리합니다.
3. TDZ와 가비지 컬렉터의 상관관계:
TDZ와 가비지 컬렉터는 직접적인 관계는 없지만, 둘 다 메모리 관리와 관련된 중요한 역할을 합니다. TDZ는 변수의 유효성 및 초기화 상태를 관리하며, 가비지 컬렉터는 메모리에서 불필요한 객체를 자동으로 제거합니다. 이 두 개념이 서로 다른 방식으로 동작하더라도, 모두 개발자가 더 안전하고 효율적인 코드를 작성하도록 돕습니다.
- TDZ: 주로 변수의 선언과 초기화 순서를 관리하는 데 초점을 둡니다. 이는 개발자가 변수를 안전하게 초기화하고 사용할 수 있도록 도와줍니다.
- 가비지 컬렉터: 메모리에서 더 이상 사용되지 않는 객체를 자동으로 제거하여, 메모리 자원을 효율적으로 관리하는 시스템입니다.
'🎒내가방 > 📒JavaScript' 카테고리의 다른 글
브라우저에서 페이지를 렌더링하는 방식 (1) | 2024.12.10 |
---|---|
[JavaScript] 실행컨텍스트와 클로저의 이해 (0) | 2024.11.25 |
[모던 자바스크립트] Ajax와 REST API (0) | 2024.10.23 |
[모던 자바스크립트] this 키워드 (0) | 2024.10.22 |
[모던 자바스크립트] 배열 고차 함수 (sort, forEach, map, filter) (0) | 2024.10.21 |