JavaScript

[JavaScript] Hoisting (ํ˜ธ์ด์ŠคํŒ…)๊ณผ data type

God Korea 2023. 1. 2. 12:58
728x90

๐Ÿ“ 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. ์ฆ‰, ์ผ๊ธ‰ํ•จ์ˆ˜๋ผ๊ณ  ํ•˜์—ฌ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ฐ€ ๋ง‰ํžŒ ๊ธฐ๋Šฅ์ด ์กด์žฌํ•œ๋‹ค.

๐Ÿคช ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ๋„ ์ด์ „๋ณด๋‹จ ๋‚ซ๋‹ค..

์ด๊ฑด ๋‚˜์—๊ฒŒ ํ•˜๋Š” ๋ง์ด๋‹ค. ์ด์ „์—๋„ ์‚ฌ์‹ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž ๊น ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ƒฅ ์•„ ์ด๋Ÿฐ ๊ฑฐ๊ตฌ๋‚˜ ๋ฐ›์•„๋“ค์ด๋ฉด์„œ ๊ณต๋ถ€ํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์— ์ž๋ฐ”๋ฅผ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„๋„ '์ดํ•ด'๋ผ๋Š” ๊ฒƒ์ด ๊ฐ€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ํ™•์‹คํžˆ ์–ด๋–ค ํ•œ ์–ธ์–ด๋ฅผ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ ๋‚˜๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ ๋„์›€์ด ๋œ๋‹ค๋Š” ๋ง์ด ์‚ฌ์‹ค์ด์—ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์ฒœ์ฒœํžˆ ํ•ด๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค.

728x90