์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ง์คํฐํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ ์ต์ ํ ๊ธฐ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ๊ฐ๋น์ง ์ปฌ๋ ์ ์ต์ ํ
ํ๋ ์น ๊ฐ๋ฐ์ ์ด์์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ต์ ์ ์ฑ๋ฅ์ ์ํด ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ์๋์ผ๋ก ์ ์ดํ๋ C๋ C++ ๊ฐ์ ์ธ์ด์ ๋ฌ๋ฆฌ, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์ ๋จ์ํํ์ง๋ง, GC์ ์๋ ๋ฐฉ์์ ์ดํดํ๊ณ ์ด๋ฅผ ์ํด ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ๋ฐ์์ฑ ์๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ณต์ก์ฑ์ ํํค์น๊ณ , ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ์ต์ ํ ์ ๋ต์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ดํดํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ํด์ ํ๋ ๊ณผ์ ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(Chrome๊ณผ Node.js์ V8, Firefox์ SpiderMonkey, Safari์ JavaScriptCore ๋ฑ)์ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น: ๋ณ์, ๊ฐ์ฒด, ํจ์ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์์ฝํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํด์ (๊ฐ๋น์ง ์ปฌ๋ ์ ): ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ฃผ์ ๋ชฉํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๋๋๋ก ๋ณด์ฅํ์ฌ, ๋ฉ๋ชจ๋ฆฌ ๋์(์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์๋ ํ์)๋ฅผ ๋ฐฉ์งํ๊ณ ํ ๋น ๋ฐ ํด์ ์ ๊ด๋ จ๋ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๋ ๊ฒ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ๋ฆฌ ์๋ช ์ฃผ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ๋ฆฌ์ ์๋ช ์ฃผ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฝํ ์ ์์ต๋๋ค:
- ํ ๋น: ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ณ์, ๊ฐ์ฒด ๋๋ ํจ์๋ฅผ ์์ฑํ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
- ์ฌ์ฉ: ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์๋๋ค.
- ํด์ : ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ ์ด์ ํ์ ์๋ค๊ณ ํ๋จ๋ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ํ๋ฉ๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ : ์๋ ๋ฐฉ์
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ์ด์ ๋๋ฌํ ์ ์๊ฑฐ๋ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๊ณ ํ์ํ๋ ์๋ ํ๋ก์ธ์ค์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค:
- ํ์ํ๊ณ ์ธ๊ธฐ(Mark and Sweep): ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ํ์(Mark): ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ฃจํธ ๊ฐ์ฒด(์: ์ ์ญ ๋ณ์)์์ ์์ํ์ฌ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ํํ๋ฉฐ ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ "์ด์์์"์ผ๋ก ํ์ํฉ๋๋ค.
- ์ธ๊ธฐ(Sweep): ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ํ(๋์ ํ ๋น์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ)์ ํ์ผ๋ฉด์ ํ์๋์ง ์์ ๊ฐ์ฒด(๋๋ฌํ ์ ์๋ ๊ฐ์ฒด)๋ฅผ ์๋ณํ๊ณ ๊ทธ๋ค์ด ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค.
- ์ฐธ์กฐ ์นด์ดํ (Reference Counting): ์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ์๋ฅผ ์ถ์ ํฉ๋๋ค. ๊ฐ์ฒด์ ์ฐธ์กฐ ์๊ฐ 0์ด ๋๋ฉด, ํด๋น ๊ฐ์ฒด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ์ด๋ค ๋ถ๋ถ์์๋ ์ฐธ์กฐ๋์ง ์๋๋ค๋ ์๋ฏธ์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ๊ตฌํ์ ๊ฐ๋จํ์ง๋ง, ์ฐธ์กฐ ์นด์ดํ ์ ์ํ ์ฐธ์กฐ(๊ฐ์ฒด๋ค์ด ์๋ก๋ฅผ ์ฐธ์กฐํ์ฌ ์ฐธ์กฐ ์๊ฐ 0์ด ๋์ง ๋ชปํ๋ ์ํ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ)๋ฅผ ๊ฐ์งํ ์ ์๋ค๋ ํฐ ํ๊ณ๊ฐ ์์ต๋๋ค.
- ์ธ๋๋ณ ๊ฐ๋น์ง ์ปฌ๋ ์ (Generational Garbage Collection): ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ฒด์ ๋์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ "์ธ๋"๋ก ๋๋๋๋ค. ์์ด๋์ด๋ ์ ์ ๊ฐ์ฒด๊ฐ ์ค๋๋ ๊ฐ์ฒด๋ณด๋ค ์ฐ๋ ๊ธฐ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ "์ ์ ์ธ๋"๋ฅผ ๋ ์์ฃผ ์์งํ๋ ๋ฐ ์ง์คํ๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ํจ์จ์ ์ ๋๋ค. ์ค๋๋ ์ธ๋๋ ๋ ์์ฃผ ์์ง๋ฉ๋๋ค. ์ด๋ "์ธ๋ ๊ฐ์ค"์ ๊ธฐ๋ฐํฉ๋๋ค.
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ ๋์ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ ์์
๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
function createObject() {
let obj = { name: "Example", value: 123 };
return obj;
}
let myObject = createObject();
myObject = null; // Remove the reference to the object
์ด ์์ ์์ createObject
ํจ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ myObject
๋ณ์์ ํ ๋นํฉ๋๋ค. myObject
๊ฐ null
๋ก ์ค์ ๋๋ฉด ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ฒฐ๊ตญ ํด๋น ๊ฐ์ฒด์ ๋ ์ด์ ๋๋ฌํ ์ ์์์ ์๋ณํ๊ณ ์ฐจ์งํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ๊ฒ์
๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ผ๋ฐ์ ์ธ ์์ธ
๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ฌ๊ฐํ๊ฒ ์ ํ์ํค๊ณ ์ถฉ๋์ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ผ๋ฐ์ ์ธ ์์ธ์ ์ดํดํ๋ ๊ฒ์ ์ด๋ฅผ ์๋ฐฉํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- ์ ์ญ ๋ณ์: ์ค์๋ก ์ ์ญ ๋ณ์๋ฅผ ์์ฑํ๋ฉด(
var
,let
, ๋๋const
ํค์๋๋ฅผ ์๋ตํ์ฌ) ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ ์ญ ๋ณ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ ๋์ ์ ์ง๋๋ฏ๋ก ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ฐฉํดํฉ๋๋ค. ํญ์ ์ ์ ํ ์ค์ฝํ ๋ด์์let
์ด๋const
(๋๋ ํจ์ ์ค์ฝํ ๋์์ด ํ์ํ๋ค๋ฉดvar
)๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ์ธ์. - ์ํ์ง ํ์ด๋จธ์ ์ฝ๋ฐฑ:
setInterval
์ด๋setTimeout
์ ์ ๋๋ก ์ ๋ฆฌํ์ง ์๊ณ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ์ด๋จธ์ ๊ด๋ จ๋ ์ฝ๋ฐฑ์ ๋ ์ด์ ํ์ํ์ง ์์ ํ์๋ ๊ฐ์ฒด๋ฅผ ๊ณ์ ์ด์์๊ฒ ํ ์ ์์ต๋๋ค. ๋ ์ด์ ํ์ํ์ง ์์ ๋๋clearInterval
๊ณผclearTimeout
์ ์ฌ์ฉํ์ฌ ํ์ด๋จธ๋ฅผ ์ ๊ฑฐํ์ธ์. - ํด๋ก์ : ํด๋ก์ ๋ ์๋์น ์๊ฒ ํฐ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์บก์ฒํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ํด๋ก์ ๊ฐ ์บก์ฒํ๋ ๋ณ์์ ์ ์ํ๊ณ ๋ถํ์ํ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ์ง ์๋๋ก ํ์ธ์.
- DOM ์์: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ DOM ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ฉด, ํนํ ํด๋น ์์๊ฐ DOM์์ ์ ๊ฑฐ๋ ๊ฒฝ์ฐ, ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค. ์ด๋ ๊ตฌํ ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ ๋ฒ์ ์์ ๋ ํํ๊ฒ ๋ฐ์ํฉ๋๋ค.
- ์ํ ์ฐธ์กฐ: ์์ ์ธ๊ธํ๋ฏ์ด, ๊ฐ์ฒด ๊ฐ์ ์ํ ์ฐธ์กฐ๋ ์ฐธ์กฐ ์นด์ดํ ๋ฐฉ์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค. ํ๋์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Mark and Sweep ๋ฑ)๋ ์ผ๋ฐ์ ์ผ๋ก ์ํ ์ฐธ์กฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ๊ฐ๋ฅํ๋ฉด ํผํ๋ ๊ฒ์ด ์ข์ ์ต๊ด์ ๋๋ค.
- ์ด๋ฒคํธ ๋ฆฌ์ค๋: ๋ ์ด์ ํ์ํ์ง ์์ ๋ DOM ์์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ๊ณ์ ์ด์์๊ฒ ํฉ๋๋ค.
removeEventListener
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ๋ฆฌํ์ธ์. ์ด๋ ๋์ ์ผ๋ก ์์ฑ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋ DOM ์์๋ฅผ ๋ค๋ฃฐ ๋ ํนํ ์ค์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ต์ ํ ๊ธฐ๋ฒ
๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ์ง๋ง, ๊ฐ๋ฐ์๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
1. ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ ํผํ๊ธฐ
๋ง์ ์์ ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋ถ๋ด์ ์ค ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ํ ๋น ๋ฐ ํด์ ํ์๋ฅผ ์ค์ด์ธ์.
์์: ๋ฃจํ์ ๊ฐ ๋ฐ๋ณต์์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
// ๋นํจ์จ์ : ๊ฐ ๋ฐ๋ณต์์ ์ ๊ฐ์ฒด ์์ฑ
for (let i = 0; i < 1000; i++) {
let obj = { index: i };
// ...
}
// ํจ์จ์ : ๋์ผํ ๊ฐ์ฒด ์ฌ์ฌ์ฉ
let obj = {};
for (let i = 0; i < 1000; i++) {
obj.index = i;
// ...
}
2. ์ ์ญ ๋ณ์ ์ต์ํ
์์ ์ธ๊ธํ๋ฏ์ด, ์ ์ญ ๋ณ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ ๋์ ์ ์ง๋๋ฉฐ ์ ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ง ์์ต๋๋ค. ์ ์ญ ๋ณ์ ์์ฑ์ ํผํ๊ณ ๋์ ์ง์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ธ์.
// ๋์ ์: ์ ์ญ ๋ณ์ ์์ฑ
myGlobalVariable = "Hello";
// ์ข์ ์: ํจ์ ๋ด ์ง์ญ ๋ณ์ ์ฌ์ฉ
function myFunction() {
let myLocalVariable = "Hello";
// ...
}
3. ํ์ด๋จธ ๋ฐ ์ฝ๋ฐฑ ์ ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ ์ด์ ํ์ํ์ง ์์ ํ์ด๋จธ์ ์ฝ๋ฐฑ์ ํญ์ ์ ๋ฆฌํ์ธ์.
let timerId = setInterval(function() {
// ...
}, 1000);
// ๋ ์ด์ ํ์ ์์ ๋ ํ์ด๋จธ ์ ๋ฆฌ
clearInterval(timerId);
let timeoutId = setTimeout(function() {
// ...
}, 5000);
// ๋ ์ด์ ํ์ ์์ ๋ ํ์์์ ์ ๋ฆฌ
clearTimeout(timeoutId);
4. ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ
๋ ์ด์ ํ์ํ์ง ์์ DOM ์์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ๋ฆฌํ์ธ์. ์ด๋ ๋์ ์ผ๋ก ์์ฑ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋ ์์๋ฅผ ๋ค๋ฃฐ ๋ ํนํ ์ค์ํฉ๋๋ค.
let element = document.getElementById("myElement");
function handleClick() {
// ...
}
element.addEventListener("click", handleClick);
// ๋ ์ด์ ํ์ ์์ ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ
element.removeEventListener("click", handleClick);
5. ์ํ ์ฐธ์กฐ ํผํ๊ธฐ
ํ๋์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ํ ์ฐธ์กฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ๊ฐ๋ฅํ๋ฉด ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์ฐธ์กฐ ์ค ํ๋ ์ด์์ null
๋ก ์ค์ ํ์ฌ ์ํ ์ฐธ์กฐ๋ฅผ ๋์ผ์ธ์.
let obj1 = {};
let obj2 = {};
obj1.reference = obj2;
obj2.reference = obj1; // ์ํ ์ฐธ์กฐ
// ์ํ ์ฐธ์กฐ ๋๊ธฐ
obj1.reference = null;
obj2.reference = null;
6. WeakMap ๋ฐ WeakSet ์ฌ์ฉ
WeakMap
๊ณผ WeakSet
์ ํค(WeakMap
์ ๊ฒฝ์ฐ) ๋๋ ๊ฐ(WeakSet
์ ๊ฒฝ์ฐ)์ด ๊ฐ๋น์ง ์ปฌ๋ ์
๋๋ ๊ฒ์ ๋ง์ง ์๋ ํน๋ณํ ์ ํ์ ์ปฌ๋ ์
์
๋๋ค. ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ํ์๋๋ ๊ฒ์ ๋ง์ง ์์ผ๋ฉด์ ํด๋น ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ด์ํค๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
WeakMap ์์:
let element = document.getElementById("myElement");
let data = new WeakMap();
data.set(element, { tooltip: "This is a tooltip" });
// ์์๊ฐ DOM์์ ์ ๊ฑฐ๋๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์
๋๋ฉฐ,
// WeakMap์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ ํจ๊ป ์ ๊ฑฐ๋ฉ๋๋ค.
WeakSet ์์:
let element = document.getElementById("myElement");
let trackedElements = new WeakSet();
trackedElements.add(element);
// ์์๊ฐ DOM์์ ์ ๊ฑฐ๋๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์
๋๋ฉฐ,
// WeakSet์์๋ ์ ๊ฑฐ๋ฉ๋๋ค.
7. ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ต์ ํ
์๊ตฌ์ฌํญ์ ๋ง๋ ์ ์ ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ธ์. ๋นํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์๋น์ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ปฌ๋ ์
์์ ์์์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์์ฃผ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ, Array
๋์ Set
์ ์ฌ์ฉํ์ธ์. Set
์ Array
(O(n))์ ๋นํด ๋ ๋น ๋ฅธ ์กฐํ ์๊ฐ(ํ๊ท O(1))์ ์ ๊ณตํฉ๋๋ค.
8. ๋๋ฐ์ด์ฑ(Debouncing)๊ณผ ์ฐ๋กํ๋ง(Throttling)
๋๋ฐ์ด์ฑ๊ณผ ์ฐ๋กํ๋ง์ ํจ์๊ฐ ์คํ๋๋ ๋น๋๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์
๋๋ค. ํนํ scroll
์ด๋ resize
์ด๋ฒคํธ์ ๊ฐ์ด ์์ฃผ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์คํ ๋น๋๋ฅผ ์ ํํจ์ผ๋ก์จ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํด์ผ ํ ์์
๋์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ์ ์ฌ์ ๊ธฐ๊ธฐ๋ ํ์ฑ DOM ์์๊ฐ ๋ง์ ์น์ฌ์ดํธ์์ ํนํ ์ค์ํฉ๋๋ค. ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ ๋๋ฐ์ด์ฑ๊ณผ ์ฐ๋กํ๋ง ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ์ฐ๋กํ๋ง ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
function throttle(func, delay) {
let timeoutId;
let lastExecTime = 0;
return function(...args) {
const currentTime = Date.now();
const timeSinceLastExec = currentTime - lastExecTime;
if (!timeoutId) {
if (timeSinceLastExec >= delay) {
func.apply(this, args);
lastExecTime = currentTime;
} else {
timeoutId = setTimeout(() => {
func.apply(this, args);
lastExecTime = Date.now();
timeoutId = null;
}, delay - timeSinceLastExec);
}
}
};
}
function handleScroll() {
console.log("Scroll event");
}
const throttledHandleScroll = throttle(handleScroll, 250); // ์ต๋ 250ms๋ง๋ค ์คํ
window.addEventListener("scroll", throttledHandleScroll);
9. ์ฝ๋ ์คํ๋ฆฌํ (Code Splitting)
์ฝ๋ ์คํ๋ฆฌํ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ ์์ ์ฒญํฌ ๋๋ ๋ชจ๋๋ก ๋ถํ ํ์ฌ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๊ฒ ํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ณ ์์ ์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ค์ผ ์ ์์ต๋๋ค. Webpack, Parcel, Rollup๊ณผ ๊ฐ์ ์ต์ ๋ฒ๋ค๋ฌ๋ ์ฝ๋ ์คํ๋ฆฌํ ์ ๋น๊ต์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค. ํน์ ๊ธฐ๋ฅ์ด๋ ํ์ด์ง์ ํ์ํ ์ฝ๋๋ง ๋ก๋ํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ํนํ ๋คํธ์ํฌ ๋์ญํญ์ด ๋ฎ๊ฑฐ๋ ์ ์ฌ์ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ๋์์ด ๋ฉ๋๋ค.
10. ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํ ์น ์์ปค(Web Workers) ์ฌ์ฉ
์น ์์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์ธ ์ค๋ ๋์ ๋ณ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ค๋ ์คํ๋๊ฑฐ๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์์ ์ ์น ์์ปค๋ก ์คํ๋ก๋ํ๋ฉด ๋ฉ์ธ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ ๋ฐ๋ ๋์์ด ๋ฉ๋๋ค. ์น ์์ปค๋ ๋ณ๋์ ์ปจํ ์คํธ์์ ์คํ๋๋ฏ๋ก ๋ฉ์ธ ์ค๋ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์์ต๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ ๋ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
// main.js
const worker = new Worker('worker.js');
worker.postMessage({ task: 'heavyComputation', data: [1, 2, 3] });
worker.onmessage = function(event) {
console.log('Result from worker:', event.data);
};
// worker.js
self.onmessage = function(event) {
const { task, data } = event.data;
if (task === 'heavyComputation') {
const result = performHeavyComputation(data);
self.postMessage(result);
}
};
function performHeavyComputation(data) {
// ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์
์ํ
return data.map(x => x * 2);
}
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ํ๋กํ์ผ๋ง
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ๋กํ์ผ๋งํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
Chrome ๊ฐ๋ฐ์ ๋๊ตฌ
Chrome ๊ฐ๋ฐ์ ๋๊ตฌ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ๋กํ์ผ๋งํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Chrome ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฝ๋๋ค (
Ctrl+Shift+I
๋๋Cmd+Option+I
). - "Memory" ํจ๋๋ก ์ด๋ํฉ๋๋ค.
- "Heap snapshot" ๋๋ "Allocation instrumentation on timeline"์ ์ ํํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค ๋ค๋ฅธ ์์ ์์ ํ์ ์ค๋ ์ท์ ์ฐ์ต๋๋ค.
- ์ค๋ ์ท์ ๋น๊ตํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ ์์ญ์ ์๋ณํฉ๋๋ค.
"Allocation instrumentation on timeline"์ ์ฌ์ฉํ๋ฉด ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ธฐ๋กํ ์ ์์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ธ์ ์ด๋์ ๋ฐ์ํ๋์ง ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
Firefox ๊ฐ๋ฐ์ ๋๊ตฌ
Firefox ๊ฐ๋ฐ์ ๋๊ตฌ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ๋กํ์ผ๋งํ๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Firefox ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฝ๋๋ค (
Ctrl+Shift+I
๋๋Cmd+Option+I
). - "Performance" ํจ๋๋ก ์ด๋ํฉ๋๋ค.
- ์ฑ๋ฅ ํ๋กํ์ผ ๊ธฐ๋ก์ ์์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ทธ๋ํ๋ฅผ ๋ถ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ ์์ญ์ ์๋ณํฉ๋๋ค.
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๊ณ ๋ ค์ฌํญ
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์:
- ๊ธฐ๊ธฐ ์ฌ์: ์ง์ญ๋ง๋ค ์ฌ์ฉ์์ ๊ธฐ๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ ์ฌ์ ๊ธฐ๊ธฐ์์๋ ํจ์จ์ ์ผ๋ก ์คํ๋๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ์ธ์.
- ๋คํธ์ํฌ ์ํ: ๋คํธ์ํฌ ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํด์ผ ํ๋ ๋ฐ์ดํฐ ์์ ์ต์ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์ค์ด์ธ์.
- ํ์งํ: ํ์งํ๋ ์ฝํ ์ธ ๋ ํ์งํ๋์ง ์์ ์ฝํ ์ธ ๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ ์ ์์ต๋๋ค. ํ์งํ๋ ์์ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ์ํ์ธ์.
๊ฒฐ๋ก
ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๋ฐ์์ฑ ์๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์๋ ๋ฐฉ์์ ์ดํดํ๊ณ ์ต์ ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉฐ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ๋กํ์ผ๋งํ์ฌ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ์ธ์. ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ ๋ ๊ธฐ๊ธฐ ์ฌ์ ๋ฐ ๋คํธ์ํฌ ์ํ์ ๊ฐ์ ๊ธ๋ก๋ฒ ์์๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ ์ ์ธ๊ณ์ ์ผ๋ก ์ฑ๋ฅ์ด ์ฐ์ํ๊ณ ํฌ์ฉ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.