[JavaScript] Hoisting (ํธ์ด์คํ )๊ณผ data type
๐ Hoisting
ํธ์ด์คํ ์ ๊ฐ์์ฌ๋ฆฌ๋ค, ๊ฒ์ํ๋ค ๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ์ ํธ์ด์คํ ์ ๋ณ์๊ฐ ์ ์ธ๋ ์์ ์ ์๋ก ๊ฐ์์ฌ๋ ค ๋ฒ๋ฆฐ๋ค๋ ๊ฒ์ด๋ค.
console.log(age);
age = 4;
var age;
ํด๋น ์ฝ๋๋ ์๋ฌ๊ฐ ๋ ๊ฒ ๊ฐ์๊ฐ? ์ ์์ ์ผ๋ก ๋ณธ๋ค๋ฉด ์๋ฌ๊ฐ ๋ง๋ค. ๊ทธ๋ฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ฅผ ์๋ฌ๋ก ์ก์ง ์๋๋ค. var๋ผ๋ ๋ณ์๋ ES6๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ๋ณ์๋ฅผ ์ ์ธํ๋ ํ์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด var๋ hoisting์ด ์ ์ฉ๋ ์์์ ๋๋ช ์ฌ๋ค.
์์ ์ฝ๋์์ age ์ ์ธ์ ๋ํ ์ฝ๋๋ ๊ฐ์ฅ ์๋์๋ค. ํ์ง๋ง ์ด๋ฅผ ๊ฐ์ฅ ์๋ก ๋์ด์ฌ๋ ค์ console.log(age)์๋ ์ ์ธ์ ๋์ง๋ง ๊ฐ์ด ๋ค์ด์์ง ์์ ๋ ์ถ๋ ฅ๋๋ undefined๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๊ณ , age = 4๋ผ๋ ์ฝ๋๋ ๊ทธ๋๋ก 4๋ฅผ ์ถ๋ ฅํ๋ค.
์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ํ ๋, ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ณ์์ ํจ์์ ๋ํด์ ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ํจ์๋ ํธ์ด์คํ ์ด ๋ผ?
catName("๊ฒจ์ธ์ด")
function catName(name) {
console.log(`์ ๊ณ ์์ด ์ด๋ฆ์ ${name}์
๋๋ค.`);
}
์์ ์ฝ๋๋ ๋ถ๋ช ํ ํจ์ ์คํ ์ฝ๋๊ฐ ๋จผ์ ๊ณ ๋ค์์ ํจ์๋ฅผ ์ ์ธํ๋ค. ํ์ง๋ง ์ ์์ ์ผ๋ก ์ถ๋ ฅ๊ฐ์ '์ ๊ณ ์์ด ์ด๋ฆ์ ๊ฒจ์ธ์ด์ ๋๋ค.' ๊ฐ ์ถ๋ ฅ๋๋ค.
๐ ES6์์์ ๋ณํ
ํจ์์ ๋ํ ํธ์ด์คํ ์ ๊ทธ๋๋ก์ด๊ธด ํ๋, ES6 ์ดํ ๋ฑ์ฅํ ๋ณ์ ์ ์ธ ์ฒด๊ณ๋ hoisting์ด ์ ์ฉ๋์ง ์๋๋ค. let๊ณผ const๊ฐ ๋ฐ๋ก ๊ทธ๊ฒ์ด๋ค.
let์ mutableํ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ ๋ ์ฌ์ฉํ๋ ๋ณ์์ด๊ณ , const๋ immutableํ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ ๋ ์ฌ์ฉํ๋ ๋ณ์์ด๋ค. Java๋ก ๋น์ ํ์๋ฉด const๋ final์ด ์ ์ธ๋ ๋ณ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋๊ฒ ๋ค.
๐ Data type
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐ์ดํฐ ํ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
string, number, boolean, null, undefined, symbol, object, function ์ด ์กด์ฌํ๋ค.
์ต์ํ ๊ฒ๋ ์๊ณ ์๋ ๊ฒ๋ ์๋ค. ํ์ง๋ง ๊ฑฐ์ ๋๋ถ๋ถ Java์๋ ๋ค๋ฅด๋ค. string์ ๊ฒฝ์ฐ Java์์ char์ String์ ํฉ์ณ๋์ ๋ฐ์ดํฐ ํ์ ์ด๊ณ , number๋ byte, short, int, long, float, double์ ํฉ์ณ๋์ ๋ฐ์ดํฐ ํ์ ์ด๋ค. boolean์ ๋์ผํ๊ณ , null์ ์๋ฏธ๋ ๊ฐ์ง๋ง Java์์๋ ๋ ํผ๋ฐ์ค ํ์ ๋ค์ ๊ธฐ๋ณธ๊ฐ์ด null์ด์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ undefined๊ฐ ํด๋น ์ญํ ์ ๋์ ํ๊ณ null์ ๊ทธ๋ฅ ๋น ๊ฐ์ ์๋ฏธํ๋ค. symbol์ ๊ฐ์ ๊ฐ์ ๊ตฌ๋ถํ ๋ ์ฌ์ฉํ๋๋ฐ ์๋ฅผ ๋ค์๋ฉด ์๋์ ๊ฐ๋ค.
// Symbol ํ์
const symbol1 = Symbol('id');
const symbol2 = Symbol('id');
console.log(symbol1 === symbol2); // ๊ฐ์ง ์์
const symbol3 = Symbol.for('id');
const symbol4 = Symbol.for('id');
console.log(symbol3 === symbol4); // ๊ฐ์
const symbol5 = Symbol('toString');
console.log(symbol5); // Symbol(toString) ์ด ์ถ๋ ฅ๋จ.
console.log(symbol5.description); // String์ผ๋ก ๋ณํํ๋ ํจ์ description์ ํ์ฉํ ๊ฒ.
symbol์ ํตํด์ ๋๋ฑ์ฑ๊ณผ ๋์ผ์ฑ์ ๋ง๋ค์ด๋ผ ์ ์๋ค. object ํ์ ์ ํํ ์๊ฐํ๋ Json ํ์ ๊ณผ ๊ฑฐ์ ๋์ผํ๊ณ , function ํ์ ์ ๋ง ๊ทธ๋๋ก ํจ์๋ฅผ ์ง์นญํ๋ค. ๋ํ, ์๋ฐ์คํฌ๋ฆฝํธ๋ first-class function. ์ฆ, ์ผ๊ธํจ์๋ผ๊ณ ํ์ฌ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ์ ์ธํ ์ ์๋ ๊ธฐ๊ฐ ๋งํ ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ค.
๐คช ํผ๋์ค๋ฌ์๋ ์ด์ ๋ณด๋จ ๋ซ๋ค..
์ด๊ฑด ๋์๊ฒ ํ๋ ๋ง์ด๋ค. ์ด์ ์๋ ์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊น ๊ณต๋ถํ๋ ค๊ณ ํ๋ ์ ์ด ์๋ค. ํ์ง๋ง ๊ทธ๋ฅ ์ ์ด๋ฐ ๊ฑฐ๊ตฌ๋ ๋ฐ์๋ค์ด๋ฉด์ ๊ณต๋ถํ์๋๋ฐ ์ด๋ฒ์ ์๋ฐ๋ฅผ ๊น๊ฒ ๊ณต๋ถํ๊ณ ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ์ ์ธ ๋ถ๋ถ๋ '์ดํด'๋ผ๋ ๊ฒ์ด ๊ฐ๊ธฐ ์์ํ๋ค. ํ์คํ ์ด๋ค ํ ์ธ์ด๋ฅผ ๊น๊ฒ ๊ณต๋ถํ๊ณ ๋๋ฉด ๋ค๋ฅธ ์ธ์ด๋ฅผ ๊ณต๋ถํ ๋ ๋์์ด ๋๋ค๋ ๋ง์ด ์ฌ์ค์ด์๋ค. ์์ผ๋ก๋ ์ฒ์ฒํ ํด๋๊ฐ์ผ๊ฒ ๋ค.