๐จJavaScript
๐ป JavaScript์ ์๋ฃํ๊ณผ JavaScript๋ง์ ํน์ฑ์ ๋ฌด์์ผ๊น ?
1. ๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด
JavaScript์ ๋ณ์๋ ์ด๋ค ํน์ ํ์ ๊ณผ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ, ๋ชจ๋ ํ์ ์ ๊ฐ์ผ๋ก ํ ๋น (๋ฐ ์ฌํ ๋น) ๊ฐ๋ฅํจ.
let foo = 42 // foo๊ฐ ์ซ์ foo = 'bar' // foo๊ฐ ์ด์ ๋ฌธ์์ด foo = true // foo๊ฐ ์ด์ ๋ถ๋ฆฌ์ธ |
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ค๋ฅธ ์ ํ์ ๊ฐ์ฒด ๋ฐ ๋ณ์์ ๋ํ ๋ช ์์ ์ฌ์์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๋์จํ ์ ํ ๋๋ ์ฝํ ์ ํ.
์ฝํ ํ์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ "๋์จํ" ํ์ ์ง์ ๊ท์น์ ์๋ชป๋๊ฑฐ๋ ์์ธกํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ์ ์์.
๋์ ์ธก๋ฉด๋ง ์๋ ๊ฒ์ด ์๋๋ผ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ๋์ ์ด๊ธฐ ๋๋ฌธ์ ๋์ ์ธ์ด๋ผ๊ณ ํจ . ๋ชจ๋ ๋ณ์๋ ๋์ ์ด๋ฉฐ(์ ํ ๋ฐ ์กด์ฌ ๋ชจ๋) ์ฝ๋๋ ๋์ .
2. JavaScript ํ๋ณํ
ํจ์์ ์ฐ์ฐ์์ ์ ๋ฌ๋๋ ๊ฐ์ ๋๋ถ๋ถ ์ ์ ํ ์๋ฃํ์ผ๋ก ์๋ ๋ณํ๋ฉ๋๋ค. ์ด๋ฐ ๊ณผ์ ์ "ํ ๋ณํ(type conversion)"์ด๋ผ๊ณ ํฉ๋๋ค.
alert๊ฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ ์๋ฃํ๊ณผ ๊ด๊ณ์์ด ์ด๋ฅผ ๋ฌธ์์ด๋ก ์๋ ๋ณํํ์ฌ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋, ์ํ ๊ด๋ จ ์ฐ์ฐ์๊ฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ ์ซ์๋ก ๋ณํํ๋ ๊ฒฝ์ฐ๊ฐ ํ ๋ณํ์ ๋ํ์ ์ธ ์์์ ๋๋ค.
์ด ์ธ์, ์ ๋ฌ๋ฐ์ ๊ฐ์ ์๋๋ฅผ ๊ฐ๊ณ ์ํ๋ ํ์ ์ผ๋ก ๋ณํ(๋ช ์์ ๋ณํ)ํด ์ฃผ๋ ๊ฒฝ์ฐ๋ ํ ๋ณํ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
- ์๋ ํ๋ณํ / ๋ช ์์ ํ๋ณํ
String() ๋ฌธ์ํ์ผ๋ก ๋ณํ : ๋ฌธ์ํ์ ๊ฐ์ด ํ์ํ ๋ ์ผ์ด๋จ
Number() ์ซ์ํ์ผ๋ก ๋ณํ / ์ซ์๊ฐ์๋์ NaN: ์ํ๊ณผ ๊ด๋ จ๋ ํจ์์ ํํ์์์ ์๋์ผ๋ก ์ผ์ด๋จ
์ซ์ํ์ผ๋ก ๋ณํ ์ ์ ์ฉ๋๋ ๊ท์น
undefined | NaN |
null | 0 |
true and false | 1 ๊ณผ 0 |
string | ๋ฌธ์์ด์ ์ฒ์๊ณผ ๋ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋ฉ๋๋ค. ๊ณต๋ฐฑ ์ ๊ฑฐ ํ ๋จ์์๋ ๋ฌธ์์ด์ด ์๋ค๋ฉด 0, ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ฌธ์์ด์์ ์ซ์๋ฅผ ์ฝ์ต๋๋ค. ๋ณํ์ ์คํจํ๋ฉด NaN์ด ๋ฉ๋๋ค. |
Boolean() ๋ถ๋ฆฐํ์ผ๋ก ๋ณํ: ๋ ผ๋ฆฌ ์ฐ์ฐ์ ์ํํ ๋ ๋ฐ์
๋ถ๋ฆฐํ์ผ๋ก์ ํ ๋ณํ ๊ท์น
์ ๋ฌ๋ฐ์ ๊ฐํ ๋ณํ ํ | ํ ๋ณํ ํ |
0, null, undefined, NaN, "" | false |
๊ทธ ์ธ์ ๊ฐ | true |
์์ธ์ ์ธ ๊ฒฝ์ฐ
- ์ซ์ํ์ผ๋ก ๋ณํ ์ undefined๋ 0์ด ์๋๋ผ NaN์ด ๋ฉ๋๋ค.
- ๋ฌธ์์ด "0"๊ณผ " "๊ฐ์ ๊ณต๋ฐฑ์ ๋ถ๋ฆฐํ์ผ๋ก ๋ณํ ์ true๊ฐ ๋ฉ๋๋ค.
3. ==, ===
== | === |
๋๋ฑ์ฐ์ฐ์ | ์ผ์น์ฐ์ฐ์ |
๋ ํผ์ฐ์ฐ์์ ๊ฐ์ด ์๋ก ๊ฐ์ผ๋ฉด ์ฐธ(true)์ ๋ฐํ ๋ ํผ์ฐ์ฐ์์ ํ์ ์ด ์๋ก ๋ค๋ฅด๋ฉด, ๋น๊ต๋ฅผ ์ํด ๊ฐ์ ๋ก ํ์ ์ ๊ฐ๊ฒ ๋ณํ |
ํ์
์ ๋ณํ ์์ด ๋ ํผ์ฐ์ฐ์์ ๊ฐ์ด ๊ฐ๊ณ , ํ์ ๋ ๊ฐ์์ผ๋ง ์ฐธ(true)์ ๋ฐํ |
ํผ์ฐ์ฐ์๋ค์ ๊ฐ๋ง ๋น๊ต |
ํผ์ฐ์ฐ์๋ค์ ๊ฐ๊ณผ ํ์ ์ ๋ชจ๋ ๋น๊ต |
0๊ณผ false๋ฅผ ๊ตฌ๋ณX |
๋ฐ์ดํฐํ์ ์ ๋๋ฑ์ฌ๋ถ๊น์ง ๊ฒ์ฌํ๊ธฐ ๋๋ฌธ์, ํผ์ฐ์ฐ์์ ๋ฐ์ดํฐํ์ ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ false๋ฅผ ๋ฐํ |
4.๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด์ ๋ฌธ์ ์ ์ ๋ฌด์์ด๊ณ ๋ณด์ํ ์ ์๋ ๋ฐฉ๋ฒ์๋ ๋ฌด์์ด ์์์ง ์๊ฐํด๋ณด์ธ์.
๋ฌธ์ ์
- ์คํ ๋์ค์ ๋ณ์์ ์์์น ๋ชปํ ํ์ ์ด ๋ค์ด์ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์
- ๋์ ํ์ ์ธ์ด๋ ๋ฐํ์ ์ ํ์ธํ ์ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์, ์ฝ๋๊ฐ ๊ธธ๊ณ ๋ณต์กํด์ง ๊ฒฝ์ฐ ํ์ ์๋ฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์ ์ง
๋ณด์๋ฐฉ๋ฒ
์ด๋ฌํ ๋ถํธํจ์ ํด์ํ๊ธฐ ์ํด TypeScipt๋ Flow ๋ฑ์ ์ฌ์ฉํ ์ ์์
5.undefined์ null์ ๋ฏธ์ธํ ์ฐจ์ด๋ค์ ๋น๊ตํด๋ณด์ธ์.
null๊ณผ undefined ๋ชจ๋ '๊ฐ์ด ์๋ค'๋ ๊ฐ์ด์, ๋ฐ์ดํฐ ํ์
์ ๋ํ๋
null์ ๊ฐ์ด์ง๋ง ๊ฐ์ผ๋ก์ ์๋ฏธ์๋ ํน๋ณํ ๊ฐ์ด ๋ฑ๋ก๋์ด ์๋ ๊ฒ,
undefined๋ ๋ฑ๋ก์ด ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ๋ ์ ์๋์ด ์์ง ์์ ๊ฒ
์ผ์น ์ฐ์ฐ์ ===๋ฅผ ์ฌ์ฉํ์ฌ ๋น๊ต | ๋๋ฑ ์ฐ์ฐ์ ==๋ฅผ ์ฌ์ฉํ์ฌ ๋น๊ต | ์ฐ์ ์ฐ์ฐ์๋ ๊ธฐํ ๋น๊ต ์ฐ์ฐ์ <, >, <=, >=๋ฅผ ์ฌ์ฉํ์ฌ ๋น๊ต |
alert( null === undefined ); // false | alert( null == undefined ); // true | null๊ณผ undefined๋ ์ซ์ํ์ผ๋ก ๋ณํ null์ 0, undefined๋ NaN์ผ๋ก ๋ณํ |
๐ปJavaScript ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด๋ ?
1.๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ
๊ธฐ๋ณธํ ๋ฐ์ดํฐ Primitive Type (์์ํ์ ) |
์ฐธ์กฐํ ๋ฐ์ดํฐ Reference Type (์ฐธ์กฐ ํ์ ) |
string ๋ฌธ์์ด ํ์ |
Object ๊ฐ์ฒด Array ๋ฐฐ์ด Function ํจ์ |
number ์ซ์ํ์ |
|
boolean ๋ ผ๋ฆฌ์ ์ฐธ๊ณผ ๊ฑฐ์ง |
|
undefined var ํค์๋๋ก ์ ์ธ๋ ๋ณ์์ ์์ฃฝ์ ์ผ๋ก ํ ๋น๋๋ ๊ฐ |
|
null ๊ฐ์ด ์๋ค๋ ๊ฒ์ ์๋์ ์ผ๋ก ๋ช ์ํ ๋ ์ฌ์ฉํ๋ ๊ฐ |
|
symbol ES6์์ ์ถ๊ฐ๋ 7๋ฒ์งธ ํ์ |
|
- ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ(immutable value) - ๋ณ์์ ํ ๋น ๋ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณ ์ ๋ ํฌ๊ธฐ๋ก ์ ์ฅ๋๊ณ , ํด๋น ๋ณ์๊ฐ ์์ ๋ฐ์ดํฐ ๊ฐ์ ๋ณด๊ด - ๋ณ์ ์ ์ธ, ์ด๊ธฐํ, ํ ๋น ์ ๊ฐ์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ง์ ์ ์ผ๋ก ์ ๊ทผ - ๋ณ์์ ์ ๊ฐ์ด ํ ๋น ๋ ๋ ๋ณ์์ ํ ๋น ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ ์ ์ฅ๋ ๊ฐ์ ๋ฐ๋ก ๋ณ๊ฒฝ |
- ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ(mutable value) - ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์์ง ์๊ณ ๋ณ์์ ํ ๋น ๋ ๋ ๊ฐ์ด ์ง์ ํด๋น ๋ณ์์ ์ ์ฅ๋ ์ ์์ผ๋ฉฐ, ๋ณ์์๋ ๋ฐ์ดํฐ์ ๋ํ ์ฐธ์กฐ๋ง ์ ์ฅ - ๋ณ์์ ๊ฐ์ด ์ ์ฅ๋ ํ(heap) ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ์ ์ ์ฅ - ๋ณ์์ ๊ฐ์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์๋ฐ์คํธ๋ฆฝํธ ์์ง์ด ๋ณ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ด์ฉํด์ ๋ณ์์ ๊ฐ์ ์ ๊ทผ |
2.๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
'๋ถ๋ณ ๊ฐ์ฒด'๋? '๋ณํ์ง ์๋ ๊ฐ์ฒด' ์ฆ ์ด๋ฏธ ํ ๋น๋ ๊ฐ์ฒด๊ฐ ๋ณํ์ง ์๋๋ค๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ง ์ธ๋ฐ const์ Object.freeze()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
const
์๋ฐ์คํฌ๋ฆฝํธ ํค์๋ ์ค ํ๋์ธ const์ด๋ค. ES6๋ฌธ๋ฒ๋ถํฐ let๊ณผ const๋ฅผ ์ง์ํ๋ค.
const ํค์๋๋ ๋ณ์๋ฅผ ์์๋ก ์ ์ธํ ์ ์๋ค, ์ผ๋ฐ์ ์ผ๋ก ์์๋ก ์ ์ธ๋ ๋ณ์๋ ๊ฐ์ ๋ฐ๊พธ์ง ๋ชปํ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์์๋ก ์ ์ธํ ๊ฐ์ฒด๋ ๋ถ๋ณ ๊ฐ์ฒด์ผ๊น?
const test = {};
test.name = "mingyo";
console.log(test); // {"mingyo"}
ES6์์์ const๋ ํ ๋น๋ ๊ฐ์ด ์์๊ฐ ๋๋ ๊ฒ์ด ์๋ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ด ์์๊ฐ ๋๋, ์ฆ test๋ณ์๊ฐ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ const ํค์๋๋ก ์ ์ธ๋ test๋ณ์์๋ ๊ฐ์ฒด ์ฌํ ๋น์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅ ํ ์ด์ ๋ ๋ณ์์ ๊ฐ(๊ฐ์ฒด) ์ฌ์ด์ ๋ฐ์ธ๋ฉ ์์ฒด๊ฐ ๋ณ๊ฒฝ์ด ๋๊ธฐ ๋๋ฌธ์ ์์์ธ test๋ณ์๋ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ด๊ณ
๊ฐ์ฒด์ ์์ฑ์ด ๋ณ๊ฒฝ๊ฐ๋ฅ ํ ์ด์ ๋ ์ค์ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ์ ๋์ง๋ง ( {} -> name : "mingyo" ) ๊ฐ์ฒด์ ๋ณ์(test)์ฌ์ด์ ๋ฐ์ธ๋ฉ์ ๋ณ๊ฒฝ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๋๋ฌธ์ ๋น๋ก ์ฌํ ๋น์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํจ์ผ๋ก ์ธํด ๋ณ์์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด์ ๋ด์ฉ๊น์ง ๋ณ๊ฒฝ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ๊ฐ์ฒด๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค๋ค. ๋ฐ๋ผ์ Object.freeze()๋ผ๋ JS๋ด์ฅ๋ฉ์๋๋ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
Object.freeze()
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ฉ์๋์ธ Object.freeze() ๋ฉ์๋์ด๋ค. ๊ณต์ ๋ฌธ์์์๋ "๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ๊ธฐ ์ํ ๋ฉ์๋" ๋ผ๊ณ ์ ํ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์๊น?๋จผ์ ์ด ๋ฉ์๋์ ์ฌ์ฉ๋ฒ๋ถํฐ ์์๋ณด๋ฉด,
let test = {
name : 'kim'
}
Object.freeze(test);
์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ๋ค. test ๋ณ์์ key value๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉ ํ Object.freeze(test)๋ฅผ ์ฌ์ฉํด ๋ฐ์ธ๋ฉ๋ ๋ณ์๋ฅผ ๋๊ฒฐ ๊ฐ์ฒด๋ก ๋ง๋ค์๋ค. ๋๋ฌธ์ test ๊ฐ์ฒด๋ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ์๋๋ ๋ถ๊ฐ๋ฅํ๋ค.
test.name = 'Jung';
console.log(test) // {name: 'kim'}
์์ ๊ฐ์ด ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ์๋๋ ๋ฌด์๋๋ค.
๊ทธ๋ฌ๋ Object.freeze()๋ ๋๊ฒฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ง๋ง ๊ฐ์ฒด์ ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค.
test = {
age : 15
};
console.log(test); // {age: 15}
์์ ๊ฐ์ด ๊ฐ์ฒด์ ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค. ๋๋ฌธ์ Object.freeze()๋ ๋ถ๋ณ ๊ฐ์ฒด๋ผ๊ณ ํ ์๋ ์์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ผ ๊ฒฐ๊ตญ ๋ถ๋ณ ๊ฐ์ฒด๋ ์ด๋ป๊ฒ ๋ง๋ค ์ ์๋๋ฉด..
const์ Object.freeze()๋ฅผ ์กฐํฉํ์ฌ ๋ง๋ค ์ ์๋ค. (const์ ์ฌํ ๋น๋ถ๊ฐ + Object.freeze()์ ๊ฐ์ฒด์์ฑ ๋ณ๊ฒฝ๋ถ๊ฐ)
๊ทธ๋ ๋ค๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
const test = {
'name' : 'jung'
};
Object.freeze(test);
๋จผ์ constํค์๋๋ก ๋ฐ์ธ๋ฉ ๋ ๋ณ์๋ฅผ ์์ํ ์ํจ ๋ค์, Object.freeze()๋ก ํด๋น ๋ณ์๋ฅผ ๋๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด
๊ฐ์ฒด์ ์ฌํ ๋น๊ณผ ๊ฐ์ฒด์ ์์ฑ ๋ ๋ค ๋ณ๊ฒฝ๋ถ๊ฐ๋ฅํ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋๋ค.
3.์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ
์์ ๋ณต์ฌ(Shallow Copy) | ๊น์ ๋ณต์ฌ(Deep Copy) |
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ๊ธฐ์กด ๊ฐ๊ณผ ๋ณต์ฌ๋ ๊ฐ์ด ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ์ ๋งํ๋ค. ๊ฐ์ฒด ์์ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ ํ ๊ฐ์ ๊ฐ์ฒด๋ผ๋ ๊ธฐ์กด ๋ณ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ์ด๋ฅผ ์์ ๋ณต์ฌ๋ผ๊ณ ํ๋ค. | ๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ ๊ฐ์ฒด ์์ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ์๋ ์๋ณธ๊ณผ์ ์ฐธ์กฐ๊ฐ ์์ ํ ๋์ด์ง ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. ๋ณต์ฌ๋ฅผ ํ๋ ๋ชฉ์ ์ ๊ธฐ์กด ๊ฐ์ฒด์ ๊ฐ๋ง ๋ณต์ฌ๋ณธ์ผ๋ก ๊ฐ์ ธ์ ๋ณ๋๋ก ํ์ฉํ๊ธฐ ์ํจ์ด ๋๋ถ๋ถ์ด๋ค. ๊ธฐ์กด ๊ฐ์ฒด๊น์ง ๊ฑด๋๋ฆฐ๋ค๋ฉด ์ด๊ฒ์ ๋ณต์ฌ๋ฅผ ํ๋ ๋ชฉ์ ์ ๋ฒ์ด๋๋ค. |
|
|
๐ป ํธ์ด์คํ ๊ณผ TDZ๋ ๋ฌด์์ผ๊น ?
1.์ค์ฝํ, ํธ์ด์คํ , TDZ
์ค์ฝํ(Scope) |
์ค์ฝํ๋ ํ๋ก๊ทธ๋จ์ ์คํ ์ปจํ ์คํธ (Execution Context)์์ ๋ณด๊ฑฐ๋ ์ ๊ทผํ ์ ์๋ ์๋ณ์๋ฅผ ๋งํ๋ค. |
|
ํธ์ด์คํ (hoisting) |
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณ์ ์ ์ธ์ ์คํ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ๊ฐ์ฅ ์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค์ ๋งํด์ ๋ณ์๋ ์ฝ๋์ ์ค๊ฐ์ ์ ์ธํ๋๋ผ๋ ๋งจ ์์ ์ ์ธํ ๊ฒ๊ณผ ๊ฐ์์ง๋ฉฐ, ์ด๋ฅผ ๋ณ์ ๋์ด์ฌ๋ฆผ, ํธ์ด์คํ
(hoisting) ์ด๋ผํ๋ค. ํธ์ด์คํ ์ด ๋ฐ์ํ๋ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํด์๊ธฐ์ ๋์ ๋ฐฉ์ ๋๋ฌธ์ด๋ค. 1. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋๊ฐ ์คํ๋๋ฉด ์ฝ๋๋ฅผ ํ์ฑํ๋ค. 2. ์ ์ญ ์ปจํ ์คํธ์ ์ ์ญ ๋ณ์ ๋ฐ ํจ์๋ฅผ ๋ฑ๋กํ๊ฒ ๋๋ค. 3. ์ฝ๋๋ฅผ ํด์ํด ๋ณ์ ๋ฐ ํจ์ ์ ์ธ๋ฌธ์ ์ฝ๋์ ์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ํจ๊ณผ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. 3. ๊ฐ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๊ณ ํจ์ ๋ด๋ถ์ ์ฝ๋๋ฅผ ํ์ฑํด์ ํจ์ ์ปจํ ์คํธ์ ํจ์ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ ๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ์คํํ๋ ์์ ์ ๊ฑฐ์น๊ฒ ๋๋ค. |
TDZ(Temporal Dead Zone) |
TDZ ๋ Temporal Dead Zone ์ ์ฝ์๋ก ์ฐ๋ฆฌ ๋ง๋ก ๋ฒ์ญํ๋ฉด ์ผ์์ ์ฌ๊ฐ์ง๋๋ผ๋ ์๋ฏธ์ด๋ฉฐ, ์ค์ฝํ ์์ ~ ์ด๊ธฐํ ์์ ์ฌ์ด์ ๊ตฌ๊ฐ์ ์๋ฏธํ๋ค. ๋ค๋ฅธ ๋ง๋ก ๋ณ์๊ฐ ์ ์ธ๋๊ณ ๋ณ์์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๊ธฐ ์ ๊น์ง์ ๊ตฌ๊ฐ์ด๋ค. |
![]() |
2.ํจ์์ ์ธ์๊ณผ ํจ์ ํํ์์์ ํธ์ด์คํ ๋ฐฉ์์ ์ฐจ์ด
ํจ์ ์ ์ธ์(function declartion) | ํจ์ ํํ์(function Expression) |
ํจ์๋ช ์ด ์ ์๋์ด ์๊ณ , ๋ณ๋์ ํ ๋น ๋ช ๋ น์ด ์๋ ๊ฒ | ์ ์ํ function์ ๋ณ๋์ ๋ณ์์ ํ ๋นํ๋ ๊ฒ |
ํจ์ ์ ์ฒด๋ฅผ ํธ์ด์คํ
์ ์๋ ๋ฒ์์ ๋งจ ์๋ก ํธ์ด์คํ ๋์ ํจ์ ์ ์ธ ์ ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ |
๋ณ๋์ ๋ณ์์ ํ ๋น ๋ณ์๋ ์ ์ธ๋ถ์ ํ ๋น๋ถ๋ฅผ ๋๋์ด ํธ์ด์คํ ์ ์ธ๋ถ๋ง ํธ์ด์คํ |
3.let, const, var, function ์ด ์ด๋ค ์๋ฆฌ๋ก ์คํ๋๋์ง
var | const | let | function | |
ํ๋ฒ ์ ์ธ๋ ๋ณ์๋ฅผ ๋ค์ ์ ์ธํ ์ ์์ ์ ์ธํ๊ธฐ ์ ์ ์ฌ์ฉํ ์ ์์ 1. ์ ์ธ ๋ฐ ์ด๊ธฐํ ๋จ๊ณ 2. ํ ๋น ๋จ๊ณ function scope |
1.์ ์ธ + ์ด๊ธฐํ + ํ ๋น Block scope Immutable |
1. ์ ์ธ 2.์ด๊ธฐํ 3.ํ ๋น Block scope Mutable |
์ ์ธ๋ฌธ ํํ์ ํธ์ด์คํ
์ผ๋ก ์ฐ์ ์ ์ผ๋ก ์ ์ฉ |
์ฌ์ ์ธ | ์ฌํ ๋น | |
var | O | O |
let | X | O |
const | X | X |
3.์คํ ์ปจํ ์คํธ์ ์ฝ ์คํ
์คํ ์ปจํ ์คํธ(execution context) | ์ฝ ์คํ(call stack) |
์๋ฐ ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ | ์ฝ๋๊ฐ ์คํ๋๋ฉด์ ์์ฑ๋๋ ์คํ ์ปจํ ์คํธ๋ฅผ ์ ์ฅํ๋ ์๋ฃ ๊ตฌ์กฐ |
1. Global Execution context ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฒ์ ์ฝ๋๋ฅผ ์คํํ ๋Global Execution Context๊ฐ ์์ฑ๋๋ค. ์์ฑ ๊ณผ์ ์์ ์ ์ญ ๊ฐ์ฒด์ธ Window Object (Node๋ Global) ๋ฅผ ์์ฑํ๊ณ this๊ฐ Window ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค. 2. Function Execution context ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํจ์๊ฐ ํธ์ถ ๋ ๋๋ง๋ค ํธ์ถ ๋ ํจ์๋ฅผ ์ํ Execution Context๋ฅผ ์์ฑํ๋ค. ๋ชจ๋ ํจ์๋ ํธ์ถ๋๋ ์์ ์ ์์ ๋ง์ Execution Context๋ฅผ ๊ฐ์ง๋ค. |
์์ง์ด ์ฒ์ script๋ฅผ ์คํํ ๋, Global Execution Context๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ Call Stack์ pushํ๋ค. ๊ทธ ํ ์์ง์ด ํจ์๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ํจ์๋ฅผ ์ํ Execution Context๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ Call Stack์ push ํ๋ค. |
4.
์ค์ฝํ ์ฒด์ธ(Scope Chain)
- JavaScript ์์ง์ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์์ ์ ํํ ์์น๋ ์ ๊ทผ์ฑ์ ์ฐพ์๋ด๊ณ ๊ทธ ํน์ ํ๋ก์ธ์ค๋ฅผ ์ค์ฝํ ์ฒด์ธ(Scope Chain)์ด๋ผ๊ณ ํ๋ค.
- ๋ฒ์ ์ฒด์ธ์ด๋ ํ ๋ณ์์ ๋ฒ์(๊ธ๋ก๋ฒ ๋๋ ๋ก์ปฌ/ํจ์ ๋๋ ๋ธ๋ก ๋ฒ์์ผ ์ ์์)๊ฐ ์๊ณ ๋ค๋ฅธ ๋ฒ์(๊ธ๋ก๋ฒ ๋๋ ๋ก์ปฌ/ํจ์ ๋๋ ๋ธ๋ก ๋ฒ์์ผ ์ ์์)๊ฐ ์๋ ๋ค๋ฅธ ๋ณ์ ๋๋ ํจ์์์ ์ฌ์ฉ๋จ์ ์๋ฏธํ๋ค.
- ์ด ์์ ํ ์ฒด์ธ ํ์ฑ์ ์ฌ์ฉ์๊ฐ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๊ณ์๋๊ณ , ์ค์งํ๊ธฐ๋ฅผ ์ํ ๋ ์ค์ง๋ฉ๋๋ค.
๋ณ์ ์๋ํ(variable shadowing)
ํน์ ๋ฒ์(๊ฒฐ์ ๋ธ๋ก, ๋ฉ์๋ ๋๋ ๋ด๋ถ ํด๋์ค) ๋ด์์ ์ ์ธ๋ ๋ณ์๊ฐ ์ธ๋ถ ๋ฒ์์์ ์ ์ธ๋ ๋ณ์์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋ ๋ฐ์
let๋ธ๋ก ๋ฒ์ ์ง์ ๊ณผ ํจ๊ป ECMAScript6 ๋์ ์ผ๋ก const๊ฐ๋ณ ์๋์์ด ๊ฐ๋ฅํจ.
function myFunc() {
let my_var = 'test';
if (true) {
let my_var = 'new test';
console.log(my_var); // new test
}
console.log(my_var); // test
}
myFunc();
๐ป์ค์ต ๊ณผ์
- ์ฝ์์ ์ฐํ b ๊ฐ์ ์์ํด๋ณด๊ณ , ์ด๋์์ ์ ์ธ๋ “b”๊ฐ ๋ช๋ฒ์งธ ๋ผ์ธ์์ ํธ์ถํ console.log์ ์ฐํ๋์ง, ์ ๊ทธ๋ฐ์ง ์ค๋ช ํด๋ณด์ธ์. ์ฃผ์์ ํ์ด๋ณด๊ณ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด ์ ์ค๋ฅ๊ฐ ๋๋ ์ง ์ค๋ช ํ๊ณ ์ค๋ฅ๋ฅผ ์์ ํด๋ณด์ธ์.
let b = 1; function hi () { const a = 1; let b = 100; b++; console.log(a,b);// a=1,b=101; } // b๋ ์ ์ญ์ค์ฝํ์ด๊ธฐ ๋๋ฌธ์์์ ์ ์ง์ญ ์ค์ฝํ์ ํ์ ์ง์ญ ์ค์ฝํ์์๋ง ์ ํจํ ์ง์ญ ์ค์ฝํ์ธ b๊ฐ ์๋ ์ ์ญ ์ค์ฝํ๊ฐ ์ถ๋ ฅ๋์๋ค. //console.log(a); a=undifend console.log(b); // b=1; hi(); console.log(b); //b=1; //let์ const๋ ์ง์ญ ๋ด์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ค ํจ์ ๋ฐ์์ a๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด ์ ์ญ์ ๋ฌ์ผํ๋ค. |
๐ป์ถ์ฒ ๋ฐ ์ฐธ๊ณ ์๋ฃ
https://developer.mozilla.org/ko/docs/Web/JavaScript/Data_structures
https://ko.javascript.info/type-conversions
https://intrepidgeeks.com/tutorial/javascript-light-copy-and-deep-copy
https://tutorialpost.apptilus.com/code/posts/js/js19-scope/
https://funveloper.tistory.com/25
https://en.wikipedia.org/wiki/Variable_shadowing
'์ด๋ ธ๋ฒ ์ด์ ์บ ํ > ์ง์์๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
5์ฃผ์ฐจ ๊ณผ์ React ์ฌํ ์ฃผ์ฐจ ํค์๋ (0) | 2022.08.26 |
---|---|
React DOM, ์๋ฒ๋ฆฌ์ค (0) | 2022.08.18 |
JWT, API (0) | 2022.08.14 |
SPA ๋ฐฉ์๊ณผ MPA ๋ฐฉ์ (0) | 2022.08.13 |
JavaScript์ ES๋?, ES5/ES6 ๋ฌธ๋ฒ ์ฐจ์ด (0) | 2022.08.12 |