This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

JavaScript ์–ธ์–ด ๊ฐœ์š”

JavaScript๋Š” ํƒ€์ž… ๋ฐ ์—ฐ์‚ฐ์ž, ํ‘œ์ค€ ๋‚ด์žฅ ๊ฐ์ฒด ๋ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋‹ค์ค‘ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋™์  ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์€ Java ๋ฐ C ์–ธ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์–ธ์–ด๋“ค์˜ ๋งŽ์€ ๊ตฌ์กฐ๊ฐ€ JavaScript์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. JavaScript๋Š” ๊ฐ์ฒด ํ”„๋กœํ† ํƒ€์ž… ๋ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜๋Š” ํ‘œํ˜„์‹์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ƒ์„ฑ๋˜๊ณ  ๋‹ค๋ฅธ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋Š” first-class์ด๋ฏ€๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๋Š” C ๋˜๋Š” Java์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ง€์‹์ด ์žˆ๋Š” ๋…์ž๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋œ, ๋‹ค์–‘ํ•œ JavaScript ์–ธ์–ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ํƒ€์ž…

๋ชจ๋“  ์–ธ์–ด์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ ํƒ€์ž…์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. JavaScript ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐ’์„ ์กฐ์ž‘ํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ฐ’์€ ๋ชจ๋‘ ํƒ€์ž…์— ์†ํ•ฉ๋‹ˆ๋‹ค. JavaScript๋Š” 7๊ฐ€์ง€ ๊ธฐ๋ณธ ์œ ํ˜•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • Number: ๋งค์šฐ ํฐ ์ •์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ˆซ์ž๊ฐ’(์ •์ˆ˜ ๋ฐ ๋ถ€๋™ ์†Œ์ˆ˜์ )์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • BigInt: ์ž„์˜์˜ ํฐ ์ •์ˆ˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • String: ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Boolean: true ๋ฐ false, ์ผ๋ฐ˜์ ์œผ๋กœ ์กฐ๊ฑด ๋…ผ๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Symbol: ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Undefined: ๋ณ€์ˆ˜์— ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • Null: ์˜๋„์ ์œผ๋กœ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ๊ฐ์ฒด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋Š” JavaScript์˜ ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ํƒ€์ž…์˜ ๊ฐ์ฒด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์ˆ˜ (Numbers)

JavaScript์—๋Š” Number์™€ BigInt๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋‚ด์žฅ ์ˆซ์ž ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆซ์ž ํƒ€์ž…์€ ์ด์ค‘์ •๋ฐ€๋„ 64๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์  ํ˜•์‹(IEEE 754)์˜ ๊ฐ’์ด๋ฉฐ, ์ฆ‰, -(253 โˆ’ 1)์™€ 253 โˆ’ 1์‚ฌ์ด์—์„œ ์ •์ˆ˜๋ฅผ ์†์‹ค ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ฐ€๋„ ๋ฐ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž๋Š” ์ตœ๋Œ€ 1.79 ร— 10308๊นŒ์ง€ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆซ์ž ๋‚ด์—์„œ JavaScript๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž์™€ ์ •์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

js
console.log(3 / 2); // 1.5, not 1

"๋ช…๋ฐฑํ•œ ์ •์ˆ˜"๋Š” ์‚ฌ์‹ค "์•”๋ฌต์ ์œผ๋กœ float(์‹ค์ˆ˜)"์ž…๋‹ˆ๋‹ค. IEEE 754 ์ธ์ฝ”๋”ฉ์œผ๋กœ ์ธํ•ด ๋•Œ๋•Œ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์  ์‚ฐ์ˆ ์—ฐ์‚ฐ์ด ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
console.log(0.1 + 0.2); // 0.30000000000000004

๋น„ํŠธ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์ด, ์ •์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ, ์ˆซ์ž๊ฐ€ 32๋น„ํŠธ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

Number ๋ฆฌํ„ฐ๋Ÿด(literals)์—๋Š” ๊ธฐ๋ณธ(2์ง„์ˆ˜, 8์ง„์ˆ˜, 10์ง„์ˆ˜ ๋˜๋Š” 16์ง„์ˆ˜) ๋˜๋Š” ์ง€์ˆ˜ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

js
console.log(0b111110111); // 503
console.log(0o767); // 503
console.log(0x1f7); // 503
console.log(5.03e2); // 503

BigInt ํƒ€์ž…์€ ์ž„์˜ ๊ธธ์ด์˜ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ ๋™์ž‘์€ C์˜ ์ •์ˆ˜ ํƒ€์ž…(์˜ˆ: ๋‚˜๋ˆ„๊ธฐ๊ฐ€ 0์œผ๋กœ ์ž๋ฅด๊ธฐ)๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ฌดํ•œ์ • ์ปค์งˆ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. BigInt๋Š” ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด๊ณผ n ์ ‘๋ฏธ์‚ฌ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

js
console.log(-3n / 2n); // -1n

๋”ํ•˜๊ธฐ, ๋นผ๊ธฐ, ๋‚˜๋จธ์ง€ ์‚ฐ์ˆ  ๋“ฑ์„ ํฌํ•จํ•œ ํ‘œ์ค€ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. BigInt์™€ ์ˆซ์ž๋Š” ์‚ฐ์ˆ  ์—ฐ์‚ฐ์—์„œ ํ˜ผํ•ฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Math ๊ฐ์ฒด๋Š” ํ‘œ์ค€ ์ˆ˜ํ•™ ํ•จ์ˆ˜์™€ ์ƒ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

js
Math.sin(3.5);
const circumference = 2 * Math.PI * r;

๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • parseInt(), ๋ฌธ์ž์—ด์—์„œ ์ •์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • parseFloat(), ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • Number() ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์„ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ˆซ์ž ํ‘œํ˜„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‹จํ•ญ ๋”ํ•˜๊ธฐ +๋ฅผ Number()์˜ ์ค„์ž„๋ง๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆซ์ž ๊ฐ’์—๋Š” NaN("Not a Number"์˜ ์ค„์ž„๋ง) ๋ฐ Infinity๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ "์ž˜๋ชป๋œ ์ˆ˜ํ•™" ์—ฐ์‚ฐ์€ NaN์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ ค๊ณ  ํ•˜๊ฑฐ๋‚˜ Math.log()๋ฅผ ์Œ์ˆ˜ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. 0์œผ๋กœ ๋‚˜๋ˆ„๋ฉด 'Infinity'(์–‘์ˆ˜ ๋˜๋Š” ์Œ์ˆ˜)๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

NaN์€ ์ „์—ผ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ•™ ์—ฐ์‚ฐ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋กœ ์ œ๊ณตํ•˜๋ฉด ๊ฒฐ๊ณผ๋„ NaN์ด ๋ฉ๋‹ˆ๋‹ค. NaN์€ ์ž์ฒด์™€ ๊ฐ™์ง€ ์•Š์€ JavaScript์˜ ์œ ์ผํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค(IEEE 754 ๋ช…์„ธ์— ๋”ฐ๋ฆ„).

๋ฌธ์ž์—ด (Strings)

JavaScript์˜ ๋ฌธ์ž์—ด์€ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์˜ ์‹œํ€€์Šค์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ตญ์ œํ™”๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ–ˆ๋˜ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋ฐ˜๊ฐ€์šด ์†Œ์‹์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” UTF-16 encoded๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

js
console.log("Hello, world");
console.log("ไฝ ๅฅฝ๏ผŒไธ–็•Œ๏ผ"); // ๊ฑฐ์˜ ๋ชจ๋“  ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์€ ์ž‘์€๋”ฐ์˜ดํ‘œ๋‚˜ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript๋Š” ๋ฌธ์ž์™€ ๋ฌธ์ž์—ด์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋ ค๋ฉด, ํ•ด๋‹น ๋‹จ์ผ ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

js
console.log("Hello"[1] === "e"); // true

๋ฌธ์ž์—ด์˜ ๊ธธ์ด(์ฝ”๋“œ ๋‹จ์œ„)๋ฅผ ์ฐพ์œผ๋ ค๋ฉด, length ์†์„ฑ์— ์ ‘๊ทผํ•˜์„ธ์š”.

๋ฌธ์ž์—ด์—๋Š” ๋ฌธ์ž์—ด์„ ์กฐ์ž‘ํ•˜๊ณ  ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ •๋ณด์— ์ ‘๊ทผํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์›์‹œ ํƒ€์ž…์€ ์„ค๊ณ„ ์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

+ ์—ฐ์‚ฐ์ž๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์˜ค๋ฒ„๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ํ”ผ์—ฐ์‚ฐ์ž ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌธ์ž์—ด์ด๋ฉด, ์ˆซ์ž ์ถ”๊ฐ€ ๋Œ€์‹  ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œํ˜„์‹์ด ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์˜ f-๋ฌธ์ž์—ด์ด๋‚˜ C#์˜ ๋ณด๊ฐ„๋œ ๋ฌธ์ž์—ด๊ณผ ๋‹ฌ๋ฆฌ, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋ฐฑํ‹ฑ(์ž‘์€๋”ฐ์˜ดํ‘œ๋‚˜ ํฐ๋”ฐ์˜ดํ‘œ๊ฐ€ ์•„๋‹˜)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

js
const age = 25;
console.log("I am " + age + " years old."); // ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ
console.log(`I am ${age} years old.`); // ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด

์ด์™ธ์˜ ํƒ€์ž…๋“ค

JavaScript๋Š” ์˜๋„์ ์œผ๋กœ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” (๊ทธ๋ฆฌ๊ณ  null ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”) ๊ฐ’์ธ null๊ณผ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” undefined๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. undefined์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ’์ด ์—†๋Š” return๋ฌธ (return;)์€ ์•”์‹œ์ ์œผ๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” object (obj.iDontExist)์— ์ ‘๊ทผํ•˜๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ดˆ๊ธฐํ™” ์—†๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ (let x;)์€ ์•”์‹œ์ ์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ undefined๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

JavaScript์—๋Š” true ๋ฐ false ๊ฐ’์ด ๊ฐ€๋Šฅํ•œ ๋ถˆ๋ฆฌ์–ธ(Boolean) ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ทœ์น™์— ๋”ฐ๋ผ ๋ชจ๋“  ๊ฐ’์„ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. false, 0, ๋นˆ ๋ฌธ์ž์—ด (""),NaN, null, ์™€ undefined์€ ๋ชจ๋‘ false๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฐ’์€ true๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ณ€ํ™˜์€ Boolean() ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
Boolean(""); // false
Boolean(234); // true

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•  ํ•„์š”๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. JavaScript๋Š” ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜ ์ž‘์—…์„ if ๋ฌธ(์ œ์–ด ๊ตฌ์กฐ ์ฐธ๊ณ )๊ณผ ๊ฐ™์ด ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ธํ•ด ์šฐ๋ฆฌ๋Š” ๋•Œ๋•Œ๋กœ ๋ถˆ๋ฆฌ์–ธ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ๊ฐ๊ฐ true, false๊ฐ€ ๋˜๋Š” "์ฐธ ๊ฐ™์€ ๊ฐ’(truthy)"์™€ "๊ฑฐ์ง“ ๊ฐ™์€ ๊ฐ’(falsy)" ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆ๋ฆฌ์–ธ ์—ฐ์‚ฐ์ž๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž && (๋…ผ๋ฆฌํ•ฉ), || (๋…ผ๋ฆฌ๊ณฑ), ๊ทธ๋ฆฌ๊ณ  ! (๋ถ€์ •)์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐํ˜ธ(Symbol) ํƒ€์ž…์€ ์ข…์ข… ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Symbol() ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ๋ชจ๋“  ๊ธฐํ˜ธ(Symbol)๋Š” ๊ณ ์œ ํ•จ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ณต์œ  ์ƒ์ˆ˜์ธ ๋“ฑ๋ก๋œ ๊ธฐํ˜ธ์™€ ํŠน์ • ์ž‘์—…์— ๋Œ€ํ•œ "ํ”„๋กœํ† ์ฝœ"๋กœ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž˜ ์•Œ๋ ค์ง„ ๊ธฐํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐํ˜ธ ์ฐธ์กฐ์—์„œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ (Variables)

JavaScript์˜ ๋ณ€์ˆ˜๋Š” let, const ๋ฐ var์˜ ์„ธ ๊ฐ€์ง€ ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

let์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ๋ ˆ๋ฒจ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” "๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ธ”๋ก"์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
let a;
let name = "Simon";

// myLetVariable๋Š” ์—ฌ๊ธฐ์—์„œ ๋ณด์ด์ง€ *์•Š์Šต๋‹ˆ๋‹ค*

for (let myLetVariable = 0; myLetVariable < 5; myLetVariable++) {
  // myLetVariable๋Š” ์—ฌ๊ธฐ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
}

// myLetVariable๋Š” ์—ฌ๊ธฐ์—์„œ ๋ณด์ด์ง€ *์•Š์Šต๋‹ˆ๋‹ค*

const๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” "๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ธ”๋ก"์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
const Pi = 3.14; // ๋ณ€์ˆ˜ Pi ์„ค์ •
console.log(Pi); // 3.14

const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

js
const Pi = 3.14;
Pi = 1; // ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

const ์„ ์–ธ์€ ์žฌํ• ๋‹น๋งŒ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ๊ฐ’์˜ ๋ณ€ํ˜•์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

js
const obj = {};
obj.a = 1; // ์—๋Ÿฌ ์—†์Œ
console.log(obj); // { a: 1 }

var ์„ ์–ธ์€ ๊ฒฝ์•…ํ•  ๋งŒํ•œ ๋™์ž‘(์˜ˆ: ๋ธ”๋ก ๋ฒ”์œ„๊ฐ€ ์•„๋‹˜)์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ์‹  JavaScript ์ฝ”๋“œ์—์„œ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด, ๊ทธ ๊ฐ’์€ undefined์ž…๋‹ˆ๋‹ค. ์–ด์ฐจํ”ผ ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ์—†์ด const ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

let ๋ฐ const ์„ ์–ธ ๋ณ€์ˆ˜๋Š” ์—ฌ์ „ํžˆ ์ •์˜๋œ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ, ์‹ค์ œ ์„ ์–ธ ์ค„ ์ด์ „์˜ ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(temporal dead zone)์œผ๋กœ ์•Œ๋ ค์ง„ ์˜์—ญ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ์„€๋„์ž‰๊ณผ ํฅ๋ฏธ๋กœ์šด ์ƒํ˜ธ ์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

js
function foo(x, condition) {
  if (condition) {
    console.log(x);
    const x = 2;
    console.log(x);
  }
}

foo(1, true);

๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ, const x = 2 ํ–‰ ์ด์ „์— x๊ฐ€ ์—ฌ์ „ํžˆ ์ƒ์œ„ ๋ฒ”์œ„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ x๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "1"๊ณผ "2"๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. JavaScript์—์„œ๋Š” ๊ฐ ์„ ์–ธ์ด ์ „์ฒด ๋ฒ”์œ„๋ฅผ ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ console.log์— "์ดˆ๊ธฐํ™” ์ „์— 'x'์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." ๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ let ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

JavaScript๋Š” ๋™์  ํƒ€์ž… ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํƒ€์ž… (์ด์ „ ์„น์…˜์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ)์€ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’๊ณผ๋งŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. let ์„ ์–ธ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ•ญ์ƒ ์žฌํ• ๋‹น์„ ํ†ตํ•ด ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
let a = 1;
a = "foo";

์—ฐ์‚ฐ์ž

JavaScript์˜ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž๋กœ๋Š” +, -, *, /, %(๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž), **(์ง€์ˆ˜ ์—ฐ์‚ฐ์ž)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ = ์—ฐ์‚ฐ์ž๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , += ์™€ -=์™€ ๊ฐ™์€ ๋ณตํ•ฉ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด์„œ๋„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์“ฐ์ธ ์—ฐ์‚ฐ์ž๋Š” x = x ์—ฐ์‚ฐ์ž y์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

js
x += 5;
x = x + 5;

++ ์™€ -- ๋ฅผ ๊ฐ๊ฐ ์ฆ๊ฐ€์™€ ๊ฐ์†Œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋˜ํ•œ ์ „์ฒ˜๋ฆฌ ๋˜๋Š” ํ›„์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+ ์—ฐ์‚ฐ์ž๋Š” ๋ฌธ์ž์—ด์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

js
"hello" + " world"; // "hello world"

์ˆซ์ž(๋˜๋Š” ๋‹ค๋ฅธ ๊ฐ’)์— ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋จผ์ € ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์„ ๋„˜์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
"3" + 4 + 5; // "345"
3 + 4 + "5"; // "75"

๋ฌด์–ธ๊ฐ€์— ๋นˆ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” ์š”๋ น์ž…๋‹ˆ๋‹ค.

JavaScript์˜ ๋น„๊ต๋Š” <, >, <= ๋ฐ >= ๋ฅผ ์‚ฌ์šฉํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด ์—ฐ์‚ฐ์ž๋“ค์€ ๋ฌธ์ž์—ด๊ณผ ์ˆ˜ ์–‘์ชฝ ๋ชจ๋‘์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋™๋“ฑ์„ฑ์„ ์œ„ํ•ด ์ด์ค‘ ๋“ฑํ˜ธ ์—ฐ์‚ฐ์ž๋Š” ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž… ๊ฐ•์ œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋•Œ๋กœ๋Š” ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, ์‚ผ์ค‘ ๋“ฑํ˜ธ ์—ฐ์‚ฐ์ž๋Š” ํƒ€์ž… ๊ฐ•์ œ ๋ณ€ํ™˜์„ ์‹œ๋„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

js
123 == "123"; // true
1 == true; // true

123 === "123"; // false
1 === true; // false

์ด์ค‘ ๋“ฑํ˜ธ์™€ ์‚ผ์ค‘ ๋“ฑํ˜ธ์—๋Š” != ์™€ !== ๊ฐ™์€ ๋ถ€๋“ฑํ˜ธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript์—๋Š” ๋น„ํŠธ ์—ฐ์‚ฐ์ž ๋ฐ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์œผ๋กœ๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์˜ "์ง„์‹ค์„ฑ"์— ๋”ฐ๋ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

js
const a = 0 && "Hello"; // 0์€ "falsy" ์ด๋ผ์„œ, 0์ž…๋‹ˆ๋‹ค.
const b = "Hello" || "world"; // "Hello"์™€ "world" ๋ชจ๋‘ "truthy"์ด๋ผ์„œ, "Hello" ์ž…๋‹ˆ๋‹ค.

&& ๋ฐ || ์—ฐ์‚ฐ์ž๋Š” ๋‹จ๋ฝ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‘ ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์‹คํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋Š” ์ฒซ ๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์— null ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

js
const name = o && o.getName();

๋˜๋Š” ์บ์‹ฑ ๊ฐ’์˜ ๊ฒฝ์šฐ(๊ฑฐ์ง“ ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)

js
const name = cachedName || (cachedName = getName());

์ „์ฒด ์—ฐ์‚ฐ์ž ๋ชฉ๋ก์€ ๊ฐ€์ด๋“œ ํŽ˜์ด์ง€ ๋˜๋Š” ์ฐธ์กฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”. ํŠนํžˆ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„์— ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

JavaScript ๋ฌธ๋ฒ•์€ C ๊ณ„์—ด๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‹๋ณ„์ž๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ˆ์•ฝ์–ด ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์„์€ ์ผ๋ฐ˜์ ์œผ๋กœ // ๋˜๋Š” /* */์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. #์„ ์‚ฌ์šฉํ•˜๋Š” Perl, Python, and Bash์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋งŽ์€ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ์„ธ๋ฏธ์ฝœ๋ก ์€ JavaScript์—์„œ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๋Š” ํ•„์š”ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Python๊ณผ ๋‹ฌ๋ฆฌ ์„ธ๋ฏธ์ฝœ๋ก ์€ ์—ฌ์ „ํžˆ ๋ฌธ๋ฒ•์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์–ดํœ˜ ๋ฌธ๋ฒ• ์ฐธ์กฐ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ œ์–ด ๊ตฌ์กฐ

JavaScript๋Š” C ๊ณ„์—ด์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ ๋น„์Šทํ•œ ์ œ์–ด ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ฌธ์€ if ๋ฐ else๋กœ ์ง€์›๋˜๋ฉฐ, ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
let name = "kittens";
if (name === "puppies") {
  name += " woof";
} else if (name === "kittens") {
  name += " meow";
} else {
  name += "!";
}
name === "kittens meow";

JavaScript์—๋Š” elif๊ฐ€ ์—†์œผ๋ฉฐ, else if๋Š” ๋‹จ์ผ if ๋ฌธ์œผ๋กœ ๊ตฌ์„ฑ๋œ else ๋ถ„๊ธฐ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

JavaScript๋Š” while ๋ฐ˜๋ณต๋ฌธ๊ณผ do...while ๋ฐ˜๋ณต๋ฌธ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ž๋Š” ๊ธฐ๋ณธ ๋ฐ˜๋ณต์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ›„์ž๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ ์–ด๋„ ํ•œ๋ฒˆ ์ด์ƒ์€ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
while (true) {
  // ๋ฌดํ•œ๋ฃจํ”„!
}

let input;
do {
  input = get_input();
} while (inputIsNotValid(input));

JavaScript์˜ for ๋ฐ˜๋ณต๋ฌธ์€ C์™€ Java์˜ ๋ฐ˜๋ณต๋ฌธ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งํ•˜์ž๋ฉด, ๋ฐ˜๋ณต๋ฌธ์— ํ•„์š”ํ•œ ์ œ์–ด ์ •๋ณด๋ฅผ ํ•œ ์ค„์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ง€์š”.

js
for (let i = 0; i < 5; i++) {
  // ๋‚ด๋ถ€ ๋™์ž‘์„ 5๋ฒˆ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค
}

JavaScript์—๋Š” ๋‘๊ฐœ์˜ ์ค‘์š”ํ•œ for ๋ฐ˜๋ณต๋ฌธ ๋˜ํ•œ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. iterables(ํŠนํžˆ ๋ฐฐ์—ด)๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” for...of, ๊ฐ์ฒด์˜ ๋ชจ๋“  enumerable ์†์„ฑ์„ ๋ฐฉ๋ฌธํ•˜๋Š” for...in์ž…๋‹ˆ๋‹ค.

js
for (const value of array) {
  // value๋กœ ์ž‘์—… ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
}

for (const property in object) {
  // ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๋กœ ์ž‘์—… ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
}

switch ๋ฌธ์€ ๋™๋“ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ๋ถ„๊ธฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
switch (action) {
  case "draw":
    drawIt();
    break;
  case "eat":
    eatIt();
    break;
  default:
    doNothing();
}

C์™€ ์œ ์‚ฌํ•˜๊ฒŒ, case ์ ˆ์€ labels๊ณผ ๊ฐœ๋…์ ์œผ๋กœ ๋™์ผํ•˜๋ฏ€๋กœ, break ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰์ด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ "๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค". ๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค์€ ์‹ค์ œ๋กœ ์ ํ”„ ํ…Œ์ด๋ธ”์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ชจ๋“  ํ‘œํ˜„์‹์ด case์ ˆ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฐ’๊ณผ ๊ฐ™์„ ๋•Œ๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. === ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘˜ ์‚ฌ์ด์—์„œ ๋น„๊ต๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Rust์™€ ๊ฐ™์€ ์ผ๋ถ€ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ, ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๋Š” JavaScript์˜ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, const a = if (x) { 1 } else { 2 }์™€ ๊ฐ™์ด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

JavaScript ์˜ค๋ฅ˜๋Š” try...catch๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

js
try {
  buildMySite("./website");
} catch (e) {
  console.error("Building site failed:", e);
}

์—๋Ÿฌ(Error)๋Š” throw ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ธฐ๋ณธ ์ œ๊ณต ์ž‘์—…๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
function buildMySite(siteDirectory) {
  if (!pathExists(siteDirectory)) {
    throw new Error("Site directory does not exist");
  }
}

์ผ๋ฐ˜์ ์œผ๋กœ, ๋ฐฉ๊ธˆ ์žก์€ ์˜ค๋ฅ˜์˜ ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. throw ๋ฌธ์—์„œ ๋ฌด์—‡์ด๋“  ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ„์˜ ์˜ˆ์™€ ๊ฐ™์ด Error ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TypeError ๋ฐ RangeError์™€ ๊ฐ™์€ Error ๋‚ด์žฅ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”๋ฐ, ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์˜๋ฏธ์ฒด๊ณ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript์—๋Š” ์กฐ๊ฑด๋ถ€ ํฌ์ฐฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€์˜ ํƒ€์ž…์˜ ์˜ค๋ฅ˜๋งŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ๋ชจ๋“  ๊ฒƒ์„ ํฌ์ฐฉํ•˜๊ณ  instanceof๋ฅผ ์‚ฌ์šฉํ•ด ์˜ค๋ฅ˜ ํƒ€์ž…์„ ์‹๋ณ„ํ•ด์•ผ ํ•˜๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ case๋ฅผ ๋‹ค์‹œ ๋˜์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

js
try {
  buildMySite("./website");
} catch (e) {
  if (e instanceof RangeError) {
    console.error("Seems like a parameter is out of range:", e);
    console.log("Retrying...");
    buildMySite("./website");
  } else {
    // ๋‹ค๋ฅธ ์—๋Ÿฌ ํƒ€์ž…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.
    // ํ˜ธ์ถœ ์Šคํƒ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๋ฅผ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜์ง€์„ธ์š”.
    throw e;
  }
}

ํ˜ธ์ถœ ์Šคํƒ์˜ try...catch์—์„œ ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ œ์–ด ํ๋ฆ„๋ฌธ์˜ ์ „์ฒด ๋ชฉ๋ก์€ ์ฐธ์กฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฐ์ฒด (Objects)

JavaScript ๊ฐ์ฒด๋Š” ๊ฐ„๋‹จํžˆ ์ด๋ฆ„-๊ฐ’ ์Œ(name-value pairs)์˜ ๋ชจ์ž„์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JavaScript์˜ ๊ฐ์ฒด์˜ ๋ชจ์ž„์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

  • Python์˜ Dictionaries.
  • Perl๊ณผ Ruby์˜ Hashes.
  • C์™€ C++ ์˜ Hash tables.
  • Java์˜ HashMaps.
  • PHP์˜ ์—ฐ๊ด€ ๋ฐฐ์—ด(Associative arrays).

JavaScript์˜ ๊ฐ์ฒด๋Š” ํ•ด์‹œ(hashes)์ž…๋‹ˆ๋‹ค. ์ •์ ์œผ๋กœ ํƒ€์ž…์ด ์ง€์ •๋œ ์–ธ์–ด์˜ ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ, JavaScript์˜ ๊ฐ์ฒด๋Š” ๋ชจ์–‘์ด ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†์„ฑ์€ ์–ธ์ œ๋“ ์ง€ ์ถ”๊ฐ€, ์‚ญ์ œ, ์žฌ์ •๋ ฌ, ๋ณ€๊ฒฝ ๋˜๋Š” ๋™์ ์œผ๋กœ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ํ‚ค๋Š” ํ•ญ์ƒ strings ๋˜๋Š” ๊ธฐํ˜ธ(symbols)์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜์ธ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋„ ์‹ค์ œ๋กœ๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

js
const obj = {
  name: "Carrot",
  for: "Max",
  details: {
    color: "orange",
    size: 12,
  },
};

๊ฐ์ฒด ์†์„ฑ์€ ์ (.) ๋˜๋Š” ๋Œ€๊ด„ํ˜ธ([])๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ, ํ‚ค๋Š” ์œ ํšจํ•œ ์‹๋ณ„์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋Œ€๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์  ํ‚ค ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
// ์  ํ‘œ๊ธฐ๋ฒ•
obj.name = "Simon";
const name = obj.name;

// ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•
obj["name"] = "Simon";
const name = obj["name"];

// ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
const userName = prompt("what is your key?");
obj[userName] = prompt("what is its value?");

์†์„ฑ ์ ‘๊ทผ์€ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
obj.details.color; // orange
obj["details"]["size"]; // 12

๊ฐ์ฒด๋Š” ํ•ญ์ƒ ์ฐธ์กฐ์ด๋ฏ€๋กœ, ๋ฌด์–ธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š” ํ•œ, ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ณ€ํ˜•์€ ์™ธ๋ถ€์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
const obj = {};
function doSomething(o) {
  o.x = 1;
}
doSomething(obj);
console.log(obj.x); // 1

์ด๋Š” ๋˜ํ•œ ๋ณ„๋„๋กœ ์ƒ์„ฑ๋œ ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฐธ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ์ฝ” ๊ฐ™์ง€ ์•Š์Œ(!==)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋‘ ๊ฐœ์˜ ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
const me = {};
const stillMe = me;
me.x = 1;
console.log(stillMe.x); // 1

๊ฐ์ฒด ๋ฐ ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€, ๊ฐ์ฒด ์ฐธ์กฐ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฐธ์กฐ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ผ๋ฐ˜์ ์œผ๋กœ (๋‚œํ•ดํ•˜๋‹ค๊ณ  ๋“ค์—ˆ์„ ์ˆ˜ ์žˆ๋Š”) ๊ธฐ๋ณธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์†์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๊ฐ์ฒด ํ”„๋กœํ† ํƒ€์ž… ๋ฐ ์ƒ์†์— ๋Œ€ํ•œ ๋ชจ๋“  ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ์† ๋ฐ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐ์—ด (Arrays)

JavaScript์—์„œ ๋ฐฐ์—ด์€ ์‹ค์ œ๋กœ๋Š” ํŠน๋ณ„ํ•œ ํƒ€์ž…์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. (์ˆซ์ž๋กœ ๋‚˜ํƒ€๋‚ธ ์†์„ฑ์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ [] ๊ตฌ๋ฌธ๋งŒ์„ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ) ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋งŽ์ด ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ, ์ด ๊ฐ์ฒด๋Š” length๋ผ๋Š” ํ•œ๊ฐ€์ง€ ๋งˆ๋ฒ•์ ์ธ ์†์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ํ•ญ์ƒ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ์ธ๋ฑ์Šค๋ณด๋‹ค ํ•˜๋‚˜ ๋” ํฐ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋ฐฐ์—ด์„ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

js
const a = ["dog", "cat", "hen"];
a.length; // 3

JavaScript ๋ฐฐ์—ด์€ ์—ฌ์ „ํžˆ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ž„์˜์˜ ์ˆซ์ž ์ธ๋ฑ์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฐฐ์—ด์— ์†์„ฑ์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ "๋งˆ๋ฒ•"์€ ํŠน์ • ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•  ๋•Œ length๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

js
const a = ["dog", "cat", "hen"];
a[100] = "fox";
console.log(a.length); // 101
console.log(a); // ['dog', 'cat', 'hen', empty ร— 97, 'fox']

์œ„์—์„œ ์–ป์€ ๋ฐฐ์—ด์„ ํฌ์†Œ ๋ฐฐ์—ด(sparse array)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ๋น„์–ด์žˆ๋Š” ์Šฌ๋กฏ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ ์—”์ง„์ด ๋ฐฐ์—ด์—์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ๋ฐฐ์—ด์„ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด ๋ฐ€์ง‘๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”!

๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ธ๋ฑ์‹ฑ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด undefined๊ฐ’์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

js
const a = ["dog", "cat", "hen"];
console.log(typeof a[90]); // undefined

๋ฐฐ์—ด์€ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž„์˜๋กœ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
const arr = [1, "foo", true];
arr.push({});
// arr = [1, "foo", true, {}]

๋ฐฐ์—ด์€ ๋‹ค๋ฅธ C ์œ ์‚ฌ ์–ธ์–ด์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ for ๋ฃจํ”„๋กœ ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
for (let i = 0; i < a.length; i++) {
  // a[i]์„ ๊ฐ€์ง€๊ณ  ์ž‘์—… ์ง„ํ–‰
}

๋ฐฐ์—ด์€ ๋˜ํ•œ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, C++/Java์˜ for (int x : arr) ๋ฌธ๋ฒ•์™€ ๋™์ผํ•œ for...of ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
for (const currentValue of a) {
  // currentValue๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—… ์ง„ํ–‰
}

๋ฐฐ์—ด์—๋Š” ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, map()์€ ๋ชจ๋“  ๋ฐฐ์—ด ์š”์†Œ์— ์ฝœ๋ฐฑ์„ ์ ์šฉํ•˜๊ณ  ์ƒˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

js
const babies = ["dog", "cat", "hen"].map((name) => `baby ${name}`);
// babies = ['baby dog', 'baby cat', 'baby hen']

ํ•จ์ˆ˜ (Functions)

๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ•จ์ˆ˜๋Š” JavaScript๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ํ•ต์‹ฌ์ด ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

js
function add(x, y) {
  const total = x + y;
  return total;
}

JavaScript ํ•จ์ˆ˜๋Š” 0๊ฐœ ์ด์ƒ์˜ ์ด๋ฆ„์ด ์žˆ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ๋ณธ์ฒด์—๋Š” ์›ํ•˜๋Š” ๋งŒํผ ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜์— ์ง€์—ญ์ ์ธ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. return ๋ฌธ์€ ์–ธ์ œ๋“ ์ง€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๋ฌธ์ด ์—†์œผ๋ฉด (ํ˜น์€ ๊ฐ’์ด ์—†๋Š” ๋ฐ˜ํ™˜์ด ์‚ฌ์šฉ๋˜๋ฉด), JavaScript๋Š” undefined์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •๋œ ๊ฒƒ๋ณด๋‹ค ๋งŽ๊ฑฐ๋‚˜ ์ ์€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด undefined๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋ณด๋‹ค ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ถ”๊ฐ€๋กœ ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

js
add(); // NaN
// add(undefined, undefined)์™€ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค.

add(2, 3, 4); // 5
// ์ฒ˜์Œ์˜ ๋‘ ์ˆ˜๊ฐ€ ๋”ํ•ด์ง‘๋‹ˆ๋‹ค. 4๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, rest ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด Python์˜ *args์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํ˜ธ์ถœ์ž๊ฐ€ ์ „๋‹ฌํ•œ ๋ชจ๋“  ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(JS๋Š” ์–ธ์–ด ์ˆ˜์ค€์—์„œ ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, **kwargs๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค).

js
function avg(...args) {
  let sum = 0;
  for (const item of args) {
    sum += item;
  }
  return sum / args.length;
}

avg(2, 3, 4, 5); // 3.5

์œ„์˜ ์ฝ”๋“œ์—์„œ args ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๋ชจ๋“  ๊ฐ’์„ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜(rest parameter)๋Š” ์„ ์–ธ๋œ ์ดํ›„์˜ ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ, ์ด์ „์—๋Š” ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, function avg(firstValue, ...args)๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ firstValue ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ธ์ˆ˜๋Š” args์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์ธ์ˆ˜ ๋ชฉ๋ก์„ ํ—ˆ์šฉํ•˜๊ณ  ์ด๋ฏธ ๋ฐฐ์—ด์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์ „๊ฐœ ์—ฐ์‚ฐ์ž ๋ฌธ๋ฒ•(spread syntax)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ์š”์†Œ ๋ชฉ๋ก์œผ๋กœ spread ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, avg(...numbers)

JavaScript์—๋Š” ๋ช…๋ช…๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ , ๋ถ„ํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
// ์ค‘๊ด„ํ˜ธ({ })์— ์œ ์˜ํ•˜์„ธ์š”. ๊ฐ์ฒด๋ฅผ ๋ถ„ํ•ดํ•ฉ๋‹ˆ๋‹ค.
function area({ width, height }) {
  return width * height;
}

// ์—ฌ๊ธฐ์„œ ์ค‘๊ด„ํ˜ธ({ })๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
console.log(area({ width: 2, height: 3 }));

๊ธฐ๋ณธ๊ฐ’ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ๋„ ์žˆ๋Š”๋ฐ, ์ƒ๋žต๋œ ๋งค๊ฐœ๋ณ€์ˆ˜(๋˜๋Š” undefined๋กœ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜)๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ–๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

js
function avg(firstValue, secondValue, thirdValue = 0) {
  return (firstValue + secondValue + thirdValue) / 3;
}

avg(1, 2); // NaN ๋Œ€์‹ , 1์ž…๋‹ˆ๋‹ค.

์ต๋ช… ํ•จ์ˆ˜

JavaScript์—์„œ๋Š” ์ต๋ช… ํ•จ์ˆ˜(์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์ด๋Ÿฐ ์ด๋ฆ„์—†๋Š” ํ•จ์ˆ˜๋“ค์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์— ์ฆ‰์‹œ ํ• ๋‹น๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

js
// ๊ด„ํ˜ธ ์•ž์— ํ•จ์ˆ˜๋ช…์ด ์—†์Œ์„ ์ฃผ๋ชฉํ•ด์ฃผ์„ธ์š”.
const avg = function (...args) {
  let sum = 0;
  for (const item of args) {
    sum += item;
  }
  return sum / args.length;
};

์œ„์— ์ •์˜๋œ ์ต๋ช… ํ•จ์ˆ˜๋Š” ์ธ์ˆ˜์™€ ํ•จ๊ป˜ avg()์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, function avg() {}์™€ ๊ฐ™์ด ์ด๋ฆ„์„ ๋ถ™์ธ ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ์˜๋ฏธ์ ์œผ๋กœ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

js
// ๊ด„ํ˜ธ ์•ž์— ํ•จ์ˆ˜๋ช…์ด ์—†์Œ์„ ์ฃผ๋ชฉํ•ด์ฃผ์„ธ์š”.
const avg = (...args) => {
  let sum = 0;
  for (const item of args) {
    sum += item;
  }
  return sum / args.length;
};

// ๋‹จ์ˆœํžˆ ํ‘œํ˜„์‹์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ, `return`์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
const sum = (a, b, c) => a + b + c;

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์˜๋ฏธ์ ์œผ๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹๊ณผ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฐธ์กฐ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ต๋ช… ํ•จ์ˆ˜๊ฐ€ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„(IIFE, Immediately Invoked Function Expressions)์ด๋ผ๋Š” ๋‹จ์ผ ํ‘œํ˜„์‹์—์„œ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋™์‹œ์— ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
(function () {
  // โ€ฆ
})();

IIFE์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด์„œ๋Š” ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด์„œ ํ”„๋ผ์ด๋น— ๋ฉ”์„œ๋“œ ํ‰๋‚ด๋‚ด๊ธฐ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์žฌ๊ท€ ํ•จ์ˆ˜

JavaScript๋Š” ์žฌ๊ท€์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ € DOM ๋“ฑ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

js
function countChars(elm) {
  if (elm.nodeType === 3) {
    // TEXT_NODE
    return elm.nodeValue.length;
  }
  let count = 0;
  for (let i = 0, child; (child = elm.childNodes[i]); i++) {
    count += countChars(child);
  }
  return count;
}

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—๋„ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์žฌ๊ท€์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
const charsInBody = (function counter(elm) {
  if (elm.nodeType === 3) {
    // TEXT_NODE
    return elm.nodeValue.length;
  }
  let count = 0;
  for (let i = 0, child; (child = elm.childNodes[i]); i++) {
    count += counter(child);
  }
  return count;
})(document.body);

์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹์— ์ œ๊ณต๋œ ์ด๋ฆ„์€ ํ•จ์ˆ˜ ์ž์ฒด ๋ฒ”์œ„์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—”์ง„์—์„œ ๋” ๋งŽ์€ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋” ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์€ ๋””๋ฒ„๊ฑฐ์™€ ์ผ๋ถ€ ์Šคํƒ ์ถ”์ ์—๋„ ํ‘œ์‹œ๋˜๋ฏ€๋กœ, ๋””๋ฒ„๊น… ์‹œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด JavaScript์—์„œ ์žฌ๊ท€๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ์ฃผ์˜ํ•˜์„ธ์š”. ์–ธ์–ด ๋ช…์„ธ์—๋Š” ๊ผฌ๋ฆฌ ํ˜ธ์ถœ ์ตœ์ ํ™”(tail-call optimization)๋กœ ์ง€์ •๋˜์–ด ์žˆ์ง€๋งŒ, ์Šคํƒ ์ถ”์  ๋ฐ ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€์œผ๋กœ ์ธํ•ด JavaScriptCore (Safari์—์„œ ์‚ฌ์šฉ)์—์„œ๋งŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊นŠ์€ ์žฌ๊ท€์˜ ๊ฒฝ์šฐ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ๋Œ€์‹  ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด(first-class objects)์ž…๋‹ˆ๋‹ค

JavaScript ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด(first-class objects)์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ณ  ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, JavaScript๋Š” ๋ช…์‹œ์ ์ธ ์บก์ฒ˜ ์—†์ด ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํด๋กœ์ €(closures)๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
// ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
const add = (x) => (y) => x + y;
// ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜
const babies = ["dog", "cat", "hen"].map((name) => `baby ${name}`);

JavaScript ํ•จ์ˆ˜๋Š” JavaScript์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ ์ž์ฒด๋กœ ๊ฐ์ฒด์ด๋ฉฐ, ์ด์ „ ๊ฐ์ฒด ์„น์…˜์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ํ•จ์ˆ˜ (Inner functions)

JavaScript์˜ ํ•จ์ˆ˜ ์„ ์–ธ์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. JavaScript์˜ ์ค‘์ฒฉ ํ•จ์ˆ˜์—์„œ๋Š” ๋ถ€๋ชจ ํ•จ์ˆ˜ ๋ฒ”์œ„์— ์žˆ๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

js
function parentFunc() {
  const a = 1;

  function nestedFunc() {
    const b = 4; // parentFunc์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜
    return a + b;
  }
  return nestedFunc(); // 5
}

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

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

ํด๋ž˜์Šค

JavaScript๋Š” Java์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ class ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

js
class Person {
  constructor(name) {
    this.name = name;
  }
  sayHello() {
    return `Hello, I'm ${this.name}!`;
  }
}

const p = new Person("Maria");
console.log(p.sayHello());

JavaScript ํด๋ž˜์Šค๋Š” new ์—ฐ์‚ฐ์ž๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ๋งˆ๋‹ค, ํด๋ž˜์Šค๊ฐ€ ์ง€์ •ํ•œ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ์ฝ”๋“œ ๊ตฌ์„ฑ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ํŒŒ์ผ ๋‹น ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํด๋ž˜์Šค ์ƒ์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ž„์‹œ๋ฐฉํŽธ์ผ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๋‹จ์ง€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ํ‘œํ˜„์‹์ผ ๋ฟ์ด๊ณ , ์ด ํŒจํ„ด์„ ๋ฏน์Šค์ธ(mixin)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

js
const withAuthentication = (cls) =>
  class extends cls {
    authenticate() {
      // โ€ฆ
    }
  };

class Admin extends withAuthentication(Person) {
  // โ€ฆ
}

์ •์  ์†์„ฑ์€ static์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Private ์†์„ฑ์€ hash(#) (private ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)๋ฅผ ์•ž์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•ด์‹œ๋Š” ์†์„ฑ ์ด๋ฆ„์˜ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. (Python์—์„œ #์„ _๋กœ ์ƒ๊ฐํ•˜์„ธ์š”.) ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ, ํด๋ž˜์Šค ๋ณธ์ฒด ์™ธ๋ถ€์—์„œ Private ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ƒ ํด๋ž˜์Šค(derived classes)์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ํด๋ž˜์Šค ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์•ˆ๋‚ด๋Š” guide page๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

JavaScript๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. ๋ณ‘๋ ฌํ™”๊ฐ€ ์—†๊ณ , ๋™์‹œ์„ฑ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ๊ตฌ๋™๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ผ๋ จ์˜ ์ž‘์—…์„ ๋Œ€๊ธฐํ•˜๊ณ  ์™„๋ฃŒ๋ฅผ ์œ„ํ•ด ํด๋ง(polling)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript์—์„œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์„ธ ๊ฐ€์ง€์˜ ๊ด€์šฉ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ๋ฐฉ๋ฒ•(์˜ˆ: setTimeout())
  • Promise ๊ธฐ๋ฐ˜ ๋ฐฉ๋ฒ•
  • Promise์˜ ๋ฌธ๋ฒ•์ ์ธ ์„คํƒ•(syntactic sugar)์ธ async/await ๋ฐฉ๋ฒ•

์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ ์ฝ๊ธฐ ์ž‘์—…์ด JavaScript์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
// ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜(Callback-based)
fs.readFile(filename, (err, content) => {
  // ์ด ์ฝœ๋ฐฑ์€ ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋ฉฐ ์ž ์‹œ ํ›„์— ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  if (err) {
    throw err;
  }
  console.log(content);
});
// ํŒŒ์ผ ์ฝ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์—ฌ๊ธฐ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

// ํ”„๋กœ๋ฏธ์Šค ๊ธฐ๋ฐ˜(Promise-based)
fs.readFile(filename)
  .then((content) => {
    // ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…
    console.log(content);
  })
  .catch((err) => {
    throw err;
  });
// ํŒŒ์ผ ์ฝ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์—ฌ๊ธฐ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

// Async/await ๊ธฐ๋ฐ˜
async function readFile(filename) {
  const content = await fs.readFile(filename);
  console.log(content);
}

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

๋น„๋™๊ธฐ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ฐ’์„ ๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ๋ฏธ์Šค(Promise)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, then() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ตœ์ข… ๊ฒฐ๊ณผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, await๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋˜๋Š” ๋ชจ๋“ˆ์ธ, ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ(๋งฅ๋ฝ)์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Promise๋Š” ์ ˆ๋Œ€๋กœ "์ฐจ๋‹จ"๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Promise์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๋…ผ๋ฆฌ๋งŒ ์—ฐ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ๋‹ค๋ฅธ ๋ชจ๋“  ์ž‘์—…์€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋ฉด, Promise๋ฅผ then()์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‚˜๋“œ(monads)๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ, ์ ์ ˆํ•œ ๋ชจ๋‚˜๋“œ๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” ์ž๋™ ํ‰๋ฉดํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Promise<Promise<T>>๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค).

์‚ฌ์‹ค, ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์€ Non-Blocking IO๋กœ ์ธํ•ด Node.js๋ฅผ ์„œ๋ฒ„ ์ธก ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋„๋ฆฌ ์„ ํƒํ•˜๊ฒŒ ํ•˜์—ฌ, ๋งŽ์€ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ์š”์ฒญ์„ ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ˆœ์ˆ˜ํ•œ JavaScript์ธ CPU ๋ฐ”์ธ๋”ฉ(๊ณ„์‚ฐ ์ง‘์•ฝ์ ) ์ž‘์—…์€ ์—ฌ์ „ํžˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ณ‘๋ ฌํ™”๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด workers๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด, promises ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ฝ์–ด๋ณด๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ JavaScript ์ž์Šต์„œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

๋ชจ๋“ˆ

๋˜ํ•œ JavaScript๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋Ÿฐํƒ€์ž„์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ผ ๊ฒฝ๋กœ ๋˜๋Š” URL๋กœ ์‹๋ณ„๋˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. import ๋ฐ export๋ฅผ ๋ชจ๋“ˆ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ช…๋ น๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
import { foo } from "./foo.js";

// export ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” ๋ชจ๋“ˆ ๋‚ด์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
const b = 2;

export const a = 1;

Haskell, Python, Java ๋“ฑ๊ณผ ๋‹ฌ๋ฆฌ JavaScript ๋ชจ๋“ˆ ํ•ด์„์€ ์ „์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ ์ •์˜์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ URL ๋˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ, ์ƒ๋Œ€ ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” "์ž‘๋™"ํ•˜๊ณ  ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ฒฝ๋กœ ๋Œ€์‹  ํ˜„์žฌ ๋ชจ๋“ˆ์˜ ๊ฒฝ๋กœ์— ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, JavaScript ์–ธ์–ด๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ชจ๋“  ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ Math ๋ฐ Intl๊ณผ ๊ฐ™์€ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์—†๋Š” JavaScript์˜ ์˜ค๋žœ ์—ญ์‚ฌ์™€, ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์„ ํƒํ•œ๋‹ค๋ฉด ๋Ÿฐํƒ€์ž„ ์„ค์ •์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋ณ€๊ฒฝ์ด ํฌํ•จ๋œ๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Node.js๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž npm์„ ์‚ฌ์šฉํ•˜๊ณ , ๋Œ€๋ถ€๋ถ„ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜์ธ ๋ฐ˜๋ฉด, Deno ๋ฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ์™„์ „ํ•œ URL ๊ธฐ๋ฐ˜์ด๋ฉฐ ๋ชจ๋“ˆ์€ HTTP URL์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ชจ๋“ˆ ๊ฐ€์ด๋“œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์–ธ์–ด ๋ฐ ๋Ÿฐํƒ€์ž„

์ด ํŽ˜์ด์ง€ ์ „์ฒด์— ๊ฑธ์ณ, ํŠน์ • ๊ธฐ๋Šฅ์€ "์–ธ์–ด ์ˆ˜์ค€"์ด๊ณ  ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ "๋Ÿฐํƒ€์ž„ ์ˆ˜์ค€"์ด๋ผ๊ณ  ์ง€์†์ ์œผ๋กœ ์–ธ๊ธ‰์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

JavaScript๋Š” ๋ฒ”์šฉ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์–ธ์–ด ๋ช…์„ธ์€ ์ˆœ์ˆ˜ํ•œ ๊ณ„์‚ฐ ๋…ผ๋ฆฌ์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…์ถœ๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ถ”๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ˆ˜์ค€์˜ API(ํŠนํžˆ console.log()) ์—†์ด, JavaScript ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์€ ์™„์ „ํžˆ ๊ด€์ฐฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ๋˜๋Š” ํ˜ธ์ŠคํŠธ๋Š” JavaScript ์—”์ง„(์ธํ„ฐํ”„๋ฆฌํ„ฐ)์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต๊ธ‰ํ•˜๊ณ  ์ถ”๊ฐ€ ์ „์—ญ ์†์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์—”์ง„์ด ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ›…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ํ™•์ธ, ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ, ๋ฉ”์‹œ์ง€ ์ธ์‡„, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ ๋“ฑ์€ ๋ชจ๋‘ ๋Ÿฐํƒ€์ž„ ์ˆ˜์ค€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. JavaScript๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ธŒ๋ผ์šฐ์ €(DOM๊ณผ ๊ฐ™์€ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค), Node.js(ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ๊ณผ ๊ฐ™์€ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค)์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์ฑ„ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. JavaScript๋Š” (๊ฐ€์žฅ ์ฃผ์š” ๋ชฉ์ ์ธ) ์›น, ๋ชจ๋ฐ”์ผ ์•ฑ, ๋ฐ์Šคํฌํƒ‘ ์•ฑ, ์„œ๋ฒ„ ์ธก ์•ฑ, ์„œ๋ฒ„๋ฆฌ์Šค, ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ๋“ฑ์— ์„ฑ๊ณต์ ์œผ๋กœ ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. JavaScript ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋Š” ๋™์•ˆ, ์ง€์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ŠคํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋น„๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ๊ตฌํ˜„๋˜๋Š” ๋ชจ๋“  ์›น ํ”Œ๋žซํผ API์— ๋Œ€ํ•ด ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ํƒ์ƒ‰

์ด ํŽ˜์ด์ง€๋Š” ๋‹ค์–‘ํ•œ JavaScript ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅธ ์–ธ์–ด์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ์ž์ฒด์™€ ๊ฐ ๊ธฐ๋Šฅ์˜ ๋‰˜์•™์Šค์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด, JavaScript ์ž์Šต์„œ ๋ฐ JavaScript ์ฐธ๊ณ ์„œ์— ๋Œ€ํ•ด ์ฝ์–ด๋ณด์„ธ์š”.

์ž‘์„ฑ ๊ณต๊ฐ„๊ณผ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์ƒ๋žต๋œ ์–ธ์–ด์˜ ์ผ๋ถ€ ํ•„์ˆ˜ ๋ถ€๋ถ„์ด ์žˆ์ง€๋งŒ, ์ง์ ‘ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.