4.1 ๋ณ์์ ๊ฐ๋ ๊ณผ ํ์์ฑ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํด, ํผ์ฐ์ฐ์(operand) ๊ธฐ์ตํด์ผ ํจ.
์ปดํจํฐ๋ CPU๋ฅผ ์ฌ์ฉํด ์ฐ์ฐํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ตํจ.
๋ฉ๋ชจ๋ฆฌ(memory):
- ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์ (memory cell)์ ์งํฉ์ฒด
- ๋ฉ๋ชจ๋ฆฌ ์ ํ๋์ ํฌ๊ธฐ๋ 1๋ฐ์ดํธ(8๋นํธ)์ด๋ฉฐ, ์ปดํจํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ ์ ํฌ๊ธฐ(1๋ฐ์ดํธ) ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ write/read
- ๊ฐ ์ ์ ๊ณ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์(memory address)๋ฅผ ๊ฐ์ง.
- ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ 2์ง์๋ก ์ ์ฅ๋จ.
์ง์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ํ์ฑ:
์ค์๋ก ์ด์์ฒด์ ์ฌ์ฉํ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์์คํ
์ ๋ฉ์ถ๊ฒ ํ๋ ์น๋ช
์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
-> ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ๋ฐ์์ ์ง์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ์ง ์๋๋ค.
๋ํ ์ฝ๋๊ฐ ์คํ๋ ๋๋ง๋ค ๊ฐ์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๋ณ๊ฒฝ๋จ.
๋ณ์(variable):
- ํ๋์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์์ฒด ๋๋ ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ณํ๊ธฐ ์ํด ๋ถ์ธ ์ด๋ฆ.
- ๋ณ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ปดํ์ผ๋ฌ ๋๋ ์ธํฐํ๋ฆฌํฐ์ ์ํด ๊ฐ์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ก ์นํ๋์ด ์คํ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํตํด ๊ฐ์ ์ ๊ทผํ ํ์ ์์ด ๋ณ์๋ฅผ ํตํด ์์ ํ๊ฒ ๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
- ๋ณ์ ๊ด๋ จ ํํ:
- ๋ณ์ ์ด๋ฆ(๋ณ์๋ช )
- ๋ณ์ ๊ฐ
- ํ ๋น(assignment)
- ์ฐธ์กฐ(reference): ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ฝ์ด ๋ค์ด๋ ๊ฒ
- ๋ณ์ ์ด๋ฆ์ ์ ์ง์! for ๊ฐ๋ ์ฑ
4.2 ์๋ณ์ (identifier)
์๋ณ์: ์ด๋ค ๊ฐ์ ๊ตฌ๋ณํด์ ์๋ณํ ์ ์๋ ๊ณ ์ ํ ์ด๋ฆ
- ์๋ณ์๋ ๊ฐ์ด ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ๋ ์ด๋ค ๊ฐ์ ์๋ณํ ์ ์๋ ์ด๋ฆ์ด๋ฉด ๋ชจ๋ ์๋ณ์๋ค. ๋ฐ๋ผ์ ๋ณ์ ์ด๋ฆ ๋ฟ๋ง ์๋๋ผ ํจ์, ํด๋์ค ๋ฑ์ ์ด๋ฆ๋ ๋ชจ๋ ์๋ณ์๋ค.
- ์๋ณ์๋ ๋ค์ด๋ฐ ๊ท์น์ ์ค์ํด์ผ ํ๋ฉฐ, ์ ์ธ(declaration)์ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ณ์์ ์กด์ฌ๋ฅผ ์๋ฆฐ๋ค.
4.3 ๋ณ์ ์ ์ธ (variable declaration)
- ๋ณ์ ์ ์ธ: ๋ณ์๋ฅผ ์์ฑํ๋ ๊ฒ. ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณด(allocate)ํ๊ณ ๋ณ์ ์ด๋ฆ๊ณผ ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ์ฐ๊ฒฐ(name binding)ํด์ ๊ฐ์ ์ ์ฅํ ์ ์๊ฒ ์ค๋นํ๋ ๊ฒ.
- ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํด์ (release) ๋๊ธฐ ์ ๊น์ง ๋๊ตฌ๋ ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณดํธ๋๋ค.
- ๋ณ์๋ฅผ ์ ์ธํ ๋๋ var, let, const ํค์๋.
- var ํค์๋์ ๋ํ์ ์ธ ๋จ์ : ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ง์. ์๋์น ์๊ฒ ์ ์ญ ๋ณ์๊ฐ ์ ์ธ๋ ์ ์๋ค.
ํค์๋(keyword): ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ํํ ๋์์ ๊ท์ ํ ์ผ์ข ์ ๋ช ๋ น์ด.
- ๋ณ์์ ๊ฐ์ ํ ๋นํ์ง ์์ผ๋ฉด ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์๋ undefined๋ผ๋ ๊ฐ์ด ํ ๋น๋์ด ์ด๊ธฐํ ๋จ. (์๋ฐ์คํฌ๋ฆฝํธ์ ๋ ํนํ ํน์ง)
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ณ์ ์ ์ธ 2๋จ๊ณ:
- ์ ์ธ ๋จ๊ณ: ๋ณ์ ์ด๋ฆ์ ๋ฑ๋กํด์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ณ์์ ์กด์ฌ๋ฅผ ์๋ฆผ
- ์ด๊ธฐํ ๋จ๊ณ: ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ์๋ฌต์ ์ผ๋ก undefined๋ฅผ ํ ๋นํด ์ด๊ธฐํํจ.
๋ชจ๋ ์๋ณ์๋ ์คํ ์ปจํ ์คํธ์ ๋ฑ๋ก๋๋ค.
์คํ ์ปจํ ์คํธ(execution context): ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์์ค์ฝ๋๋ฅผ ํ๊ฐํ๊ณ ์คํํ๊ธฐ ์ํด ํ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๊ณ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๋ก ๊ด๋ฆฌํ๋ ์์ญ. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์ปจํ ์คํธ๋ฅผ ํตํด ์๋ณ์์ ์ค์ฝํ๋ฅผ ๊ด๋ฆฌํจ.
๋ณ์ ์ด๋ฆ๊ณผ ๋ณ์ ๊ฐ์ ์คํ ์ปจํ ์คํธ ๋ด์ key/value ํ์์ธ ๊ฐ์ฒด๋ก ๋ฑ๋ก๋์ด ๊ด๋ฆฌ๋จ. -> 13์ฅ๊ณผ 23์ฅ์์ ๊ณ์.
var : ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ ๋์์ ์งํ๋จ. undefined๋ก ์๋ฌต์ ์ธ ์ด๊ธฐํ ์๋ ์ํ๋จ.
* ์ด๊ธฐํ(initialization) : ๋ณ์ ์ ์ธ ์ดํ ์ต์ด๋ก ๊ฐ ํ ๋น.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฐ๋ ๊ธฐ ๊ฐ(garbage value)๋ก๋ถํฐ ์์ ํ๋ค. ์ด๊ธฐํ ๋จ๊ณ๋ฅผ ๊ฑฐ์น์ง ์์ผ๋ฉด ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ด์ ์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ๋ ๊ฐ์ด ๋จ์์์ ์ ์์ง๋ง, ์๋ฌต์ ์ผ๋ก ์ด๊ธฐํํด์ฃผ๊ธฐ ๋๋ฌธ.
์ ์ธํ์ง ์์ ์๋ณ์์ ์ ๊ทผํ๋ฉด ReferenceError(์ฐธ์กฐ ์๋ฌ)๊ฐ ๋ฐ์ํ๋ค.
4.4 ๋ณ์ ์ ์ธ์ ์คํ ์์ ๊ณผ ๋ณ์ ํธ์ด์คํ
console.log(score);
var scope;
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์ธํฐํ๋ฆฌํฐ์ ์ํด ์์ฐจ ์คํ๋๋ฏ๋ก, ์ ์ฝ๋์์ console.log๊ฐ ๋จผ์ ์คํ๋์ง๋ง ReferenceError๊ฐ ๋ฐ์ํ์ง ์๊ณ undefined๊ฐ ์ถ๋ ฅ๋๋ค.
-> ๋ณ์ ์ ์ธ์ด ๋ฐํ์์ด ์๋๋ผ ๊ทธ ์ด์ ๋จ๊ณ์์ ๋จผ์ ์คํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฐํ์์ ์์ ์์ค์ฝ๋์ ํ๊ฐ ๊ณผ์ , ์ค๋น๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค. ์ด๋ ๋ชจ๋ ์ ์ธ๋ฌธ์ ์ฐพ์ ๋จผ์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐํ์์๋ ์ ์ธ๋ฌธ์ ์ ์ธํ ์์ค์ฝ๋๋ฅผ ์์ฐจ ์คํํ๋ค.
๋ณ์ ํธ์ด์คํ (variable hoisting): ๋ณ์ ์ ์ธ๋ฌธ์ด ์ฝ๋์ ์ ๋๋ก ๋์ด ์ฌ๋ ค์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ณ ์ ์ ํน์ง.
**๋ณ์ ์ ์ธ๋ฟ ์๋๋ผ var, let, const, function, function*, class ํค์๋๋ก ์ ์ธ๋ ๋ชจ๋ ์๋ณ์๋ ํธ์ด์คํ ๋๋ค. ๋ชจ๋ ์ ์ธ๋ฌธ์ ๋ฐํ์ ์ด์ ๋จ๊ณ์์ ๋จผ์ ์คํ๋๊ธฐ ๋๋ฌธ.
4.5 ๊ฐ์ ํ ๋น
ํ ๋น ์ฐ์ฐ์ =
console.log(score); // undefined ์ถ๋ ฅ
score = 80;
var score; // ๋ณ์ ์ ์ธ๊ณผ ๊ฐ์ ํ ๋น
console.log(score); // 80 ์ถ๋ ฅ
๋ณ์ ์ ์ธ์ ๋ฐํ์ ์ด์ ์ ๋จผ์ ์คํ๋์ง๋ง, ๊ฐ์ ํ ๋น์ ๋ฐํ์์ ์คํ๋จ
๋ณ์์ ๊ฐ์ ํ ๋นํ ๋๋, ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๊ทธ๊ณณ์ ํ ๋น ๊ฐ์ ์ ์ฅํ๋ค.
4.6 ๊ฐ์ ์ฌํ ๋น
์ฌํ ๋น ์์๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ ์ ์ฅํ๋ค.
๊ฐ๋น์ง ์ฝ๋ ํฐ(garbage collector) :
์ ํ๋ฆฌ์ผ์ด์ ์ด ํ ๋น(allocate)ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฒ์ฌํ์ฌ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ (release)ํ๋ ๊ธฐ๋ฅ. ์ด๋ค ์๋ณ์๋ ์ฐธ์กฐํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ๋น์ง ์ฝ๋ ํฐ๋ฅผ ๋ด์ฅํ๊ณ ์๋ ๋งค๋์ง๋ ์ธ์ด๋ก์ ๊ฐ๋น์ง ์ฝ๋ ํฐ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)์ ๋ฐฉ์งํ๋ค.
๋จ, ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์ ํด์ ๋ ์ง๋ ์์ธกํ ์ ์๋ค.
์ธ๋งค๋์ง๋ ์ธ์ด vs ๋งค๋์ง๋ ์ธ์ด :
์ธ๋งค๋์ง๋ ์ธ์ด like C : malloc(), free() ๊ฐ์ low-level ๋ฉ๋ชจ๋ฆฌ ์ ์ด ๊ธฐ๋ฅ ํ์ฉ.
๋งค๋์ง๋ ์ธ์ด: ๋ฉ๋ชจ๋ฆฌ ์ ์ด ํ์ฉx. ๊ฐ๋น์ง ์ฝ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ์ํ.
4.7 ์๋ณ์ ๋ค์ด๋ฐ ๊ท์น
- ํน์๋ฌธ์๋ฅผ ์ ์ธํ ๋ฌธ์, ์ซ์, ์ธ๋์ค์ฝ์ด(_), ๋ฌ๋ฌ ๊ธฐํธ($) ํฌํจ ๊ฐ๋ฅ
- ์๋ณ์๋ ํน์๋ฌธ์๋ฅผ ์ ์ธํ ๋ฌธ์, ์ธ๋์ค์ฝ์ด(_), ๋ฌ๋ฌ ๊ธฐํธ($)๋ก ์์ํด์ผ ํจ. ์ซ์ ์์x
- ์์ฝ์ด๋ ์๋ณ์๋ก ์ฌ์ฉ x
- ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ณํจ.
์ฑ ์์๋ ์ํ๋ฒณ ์ธ์ ์ ๋์ฝ๋ ๋ฌธ์์ ์๋ณ์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์๋๋ค๊ณ ์ธ๊ธํ์๋ค. ๋ฐ๋ฉด ํฅ๋ฏธ๋กญ๊ฒ๋ ํ ์ค์์๋ ๋ณ์๋ช ์ ํ๊ธ๋ก ์ง๋ ์ปจ๋ฒค์ ์ด ์๋ค!
https://tosspayments-dev.oopy.io/chapters/frontend/posts/hangul-coding-convention
์๋ฐ์คํฌ๋ฆฝํธ ๋ค์ด๋ฐ ์ปจ๋ฒค์ (naming convention):
- ๋ณ์์ ํจ์ ์ด๋ฆ: ์นด๋ฉ ์ผ์ด์ค (camelCase)
- ์์ฑ์ ํจ์์ ํด๋์ค ์ด๋ฆ: ํ์ค์นผ ์ผ์ด์ค (PascalCase)
๋ณ์์ ์กด์ฌ ๋ชฉ์ ์ ๋ช ํํ ๋๋ฌ๋ด์. ๋ณ์ ์ ์ธ์ ๋ณ๋์ ์ฃผ์์ด ํ์ํ๋ค๋ฉด ๋ณ์์ ์กด์ฌ ๋ชฉ์ ์ ๋ช ํํ ๋๋ฌ๋ด์ง ๋ชปํ๋ ๊ฒ.
๐ ์ง๋ฌธ: ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น ๊ณผ์ ์ ์ค๋ช ํด์ฃผ์ธ์.
๐ ์ง๋ฌธ: ์๋์ ์ฝ๋ ๋ธ๋ก์์, ๊ฐ console.log์ ๊ฒฐ๊ณผ์ ๊ทธ ์ด์ ๋ฅผ ์ค๋ช ํ์ธ์.
console.log(score);
score = 80;
var score;
console.log(score);
๐ ์ง๋ฌธ: ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌํ ๋น์ ํ ๋ ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณ์๋ฅผ ํ ๋นํ ๊น์? Hint: 6์ฅ ๋ฐ์ดํฐํ์ .
ใ๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ Deep Diveใ ๋ฅผ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๊ธฐ๋ก์ ๋๋ค.