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๋ ๋ถ๋ ์์์ ์ซ์์ ์ ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
console.log(3 / 2); // 1.5, not 1
"๋ช ๋ฐฑํ ์ ์"๋ ์ฌ์ค "์๋ฌต์ ์ผ๋ก float(์ค์)"์ ๋๋ค. IEEE 754 ์ธ์ฝ๋ฉ์ผ๋ก ์ธํด ๋๋๋ก ๋ถ๋ ์์์ ์ฐ์ ์ฐ์ฐ์ด ์ ํํ์ง ์์ ์ ์์ต๋๋ค.
console.log(0.1 + 0.2); // 0.30000000000000004
๋นํธ ์ฐ์ฐ๊ณผ ๊ฐ์ด, ์ ์๊ฐ ํ์ํ ์ฐ์ฐ์ ๊ฒฝ์ฐ, ์ซ์๊ฐ 32๋นํธ ์ ์๋ก ๋ณํ๋ฉ๋๋ค.
Number ๋ฆฌํฐ๋ด(literals)์๋ ๊ธฐ๋ณธ(2์ง์, 8์ง์, 10์ง์ ๋๋ 16์ง์) ๋๋ ์ง์ ์ ๋ฏธ์ฌ๋ฅผ ๋ํ๋ด๋ ์ ๋์ฌ๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
console.log(0b111110111); // 503
console.log(0o767); // 503
console.log(0x1f7); // 503
console.log(5.03e2); // 503
BigInt ํ์
์ ์์ ๊ธธ์ด์ ์ ์์
๋๋ค. ๊ทธ ๋์์ C์ ์ ์ ํ์
(์: ๋๋๊ธฐ๊ฐ 0์ผ๋ก ์๋ฅด๊ธฐ)๊ณผ ์ ์ฌํ์ง๋ง, ๋ฌดํ์ ์ปค์ง์ ์๋ค๋ ์ ๊ณผ ๋ค๋ฆ
๋๋ค. BigInt๋ ์ซ์ ๋ฆฌํฐ๋ด๊ณผ n
์ ๋ฏธ์ฌ๋ก ์ง์ ๋ฉ๋๋ค.
console.log(-3n / 2n); // -1n
๋ํ๊ธฐ, ๋นผ๊ธฐ, ๋๋จธ์ง ์ฐ์ ๋ฑ์ ํฌํจํ ํ์ค ์ฐ์ ์ฐ์ฐ์๊ฐ ์ง์๋ฉ๋๋ค. BigInt์ ์ซ์๋ ์ฐ์ ์ฐ์ฐ์์ ํผํฉ๋ ์ ์์ต๋๋ค.
Math
๊ฐ์ฒด๋ ํ์ค ์ํ ํจ์์ ์์๋ฅผ ์ ๊ณตํฉ๋๋ค.
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๋ฅผ ์ฌ์ฉํฉ๋๋ค.
console.log("Hello, world");
console.log("ไฝ ๅฅฝ๏ผไธ็๏ผ"); // ๊ฑฐ์ ๋ชจ๋ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ๋ฌธ์ ๊ทธ๋๋ก ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ์์ฑํ ์ ์์ต๋๋ค.
๋ฌธ์์ด์ ์์๋ฐ์ดํ๋ ํฐ๋ฐ์ดํ๋ก ์์ฑํ ์ ์์ต๋๋ค. JavaScript๋ ๋ฌธ์์ ๋ฌธ์์ด์ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ๋จ์ผ ๋ฌธ์๋ฅผ ๋ํ๋ด๋ ค๋ฉด, ํด๋น ๋จ์ผ ๋ฌธ์๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
console.log("Hello"[1] === "e"); // true
๋ฌธ์์ด์ ๊ธธ์ด(์ฝ๋ ๋จ์)๋ฅผ ์ฐพ์ผ๋ ค๋ฉด, length
์์ฑ์ ์ ๊ทผํ์ธ์.
๋ฌธ์์ด์๋ ๋ฌธ์์ด์ ์กฐ์ํ๊ณ ๋ฌธ์์ด์ ๋ํ ์ ๋ณด์ ์ ๊ทผํ๋ ์ ํธ๋ฆฌํฐ ๋ฉ์๋๊ฐ ์์ต๋๋ค. ๋ชจ๋ ์์ ํ์ ์ ์ค๊ณ ์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ๋ฉ์๋๋ ์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
+
์ฐ์ฐ์๋ ๋ฌธ์์ด์ ๋ํด ์ค๋ฒ๋ก๋๋ฉ๋๋ค. ํผ์ฐ์ฐ์ ์ค ํ๋๊ฐ ๋ฌธ์์ด์ด๋ฉด, ์ซ์ ์ถ๊ฐ ๋์ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ์ํํฉ๋๋ค. ํน๋ณํ ํ
ํ๋ฆฟ ๋ฌธ์์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ํํ์์ด ํฌํจ๋ ๋ฌธ์์ด์ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. Python์ f-๋ฌธ์์ด์ด๋ C#์ ๋ณด๊ฐ๋ ๋ฌธ์์ด๊ณผ ๋ฌ๋ฆฌ, ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋ฐฑํฑ(์์๋ฐ์ดํ๋ ํฐ๋ฐ์ดํ๊ฐ ์๋)์ ์ฌ์ฉํฉ๋๋ค.
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) ํ์
์ด ์์ต๋๋ค. ๋ ๋ค ํค์๋์
๋๋ค. ๋ค์ ๊ท์น์ ๋ฐ๋ผ ๋ชจ๋ ๊ฐ์ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
false
,0
, ๋น ๋ฌธ์์ด (""
),NaN
,null
, ์undefined
์ ๋ชจ๋false
๊ฐ ๋ฉ๋๋ค.- ๋ค๋ฅธ ๋ชจ๋ ๊ฐ์
true
๊ฐ ๋ฉ๋๋ค.
์ด ๋ณํ์ Boolean()
ํจ์๋ฅผ ์จ์ ๋ช
์์ ์ผ๋ก ์ด ์์
์ ์ํํ์ค ์ ์์ต๋๋ค.
Boolean(""); // false
Boolean(234); // true
ํ์ง๋ง ์ด๋ ๊ฒ ํ ํ์๋ ๊ฑฐ์ ์์ต๋๋ค. JavaScript๋ ์ด๋ฌํ ๋ณํ ์์
์ if
๋ฌธ(์ ์ด ๊ตฌ์กฐ ์ฐธ๊ณ )๊ณผ ๊ฐ์ด ๋ถ๋ฆฌ์ธ ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ์๋์ผ๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ธํด ์ฐ๋ฆฌ๋ ๋๋๋ก ๋ถ๋ฆฌ์ธ ์ปจํ
์คํธ์์ ์ฌ์ฉ๋ ๋ ๊ฐ๊ฐ true
, false
๊ฐ ๋๋ "์ฐธ ๊ฐ์ ๊ฐ(truthy)"์ "๊ฑฐ์ง ๊ฐ์ ๊ฐ(falsy)" ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฒ์
๋๋ค.
๋ถ๋ฆฌ์ธ ์ฐ์ฐ์๋ ๋
ผ๋ฆฌ ์ฐ์ฐ์ &&
(๋
ผ๋ฆฌํฉ), ||
(๋
ผ๋ฆฌ๊ณฑ), ๊ทธ๋ฆฌ๊ณ !
(๋ถ์ )์ด ์ง์๋ฉ๋๋ค. ์ฐ์ฐ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ธฐํธ(Symbol) ํ์
์ ์ข
์ข
๊ณ ์ ํ ์๋ณ์๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Symbol()
ํจ์๋ก ๋ง๋ ๋ชจ๋ ๊ธฐํธ(Symbol)๋ ๊ณ ์ ํจ์ ๋ณด์ฅํฉ๋๋ค. ๋ํ, ๊ณต์ ์์์ธ ๋ฑ๋ก๋ ๊ธฐํธ์ ํน์ ์์
์ ๋ํ "ํ๋กํ ์ฝ"๋ก ์ธ์ด์์ ์ฌ์ฉ๋๋ ์ ์๋ ค์ง ๊ธฐํธ๊ฐ ์์ต๋๋ค. ๊ธฐํธ ์ฐธ์กฐ์์ ์์ธํ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค.
๋ณ์ (Variables)
JavaScript์ ๋ณ์๋ let
, const
๋ฐ var
์ ์ธ ๊ฐ์ง ํค์๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ๋ฉ๋๋ค.
let
์ ์ฌ์ฉํ๋ฉด ๋ธ๋ก ๋ ๋ฒจ ๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ์ ์ธ๋ ๋ณ์๋ "๋ณ์๊ฐ ์ ์ธ๋ ๋ธ๋ก"์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
let a;
let name = "Simon";
// myLetVariable๋ ์ฌ๊ธฐ์์ ๋ณด์ด์ง *์์ต๋๋ค*
for (let myLetVariable = 0; myLetVariable < 5; myLetVariable++) {
// myLetVariable๋ ์ฌ๊ธฐ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค
}
// myLetVariable๋ ์ฌ๊ธฐ์์ ๋ณด์ด์ง *์์ต๋๋ค*
const
๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ ๋ณ์๋ฅผ ์ ์ธํ ์ ์๊ฒ ํฉ๋๋ค. ๋ณ์๋ "๋ณ์๊ฐ ์ ์ธ๋ ๋ธ๋ก"์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const Pi = 3.14; // ๋ณ์ Pi ์ค์
console.log(Pi); // 3.14
const
๋ก ์ ์ธ๋ ๋ณ์๋ ์ฌํ ๋นํ ์ ์์ต๋๋ค.
const Pi = 3.14;
Pi = 1; // ์์ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
const
์ ์ธ์ ์ฌํ ๋น๋ง ๋ฐฉ์งํฉ๋๋ค. ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ ๋ณ์ ๊ฐ์ ๋ณํ์ ๋ฐฉ์งํ์ง ์์ต๋๋ค.
const obj = {};
obj.a = 1; // ์๋ฌ ์์
console.log(obj); // { a: 1 }
var
์ ์ธ์ ๊ฒฝ์
ํ ๋งํ ๋์(์: ๋ธ๋ก ๋ฒ์๊ฐ ์๋)์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ต์ JavaScript ์ฝ๋์์๋ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
๊ฐ์ ํ ๋นํ์ง ์๊ณ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด, ๊ทธ ๊ฐ์ undefined
์
๋๋ค. ์ด์ฐจํผ ๋์ค์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๊ธฐํํด์ฃผ๋ ๊ฒ์์ด const
๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
let
๋ฐ const
์ ์ธ ๋ณ์๋ ์ฌ์ ํ ์ ์๋ ์ ์ฒด ๋ฒ์๋ฅผ ์ฐจ์งํ๋ฉฐ, ์ค์ ์ ์ธ ์ค ์ด์ ์ ์ผ์์ ์ฌ๊ฐ์ง๋(temporal dead zone)์ผ๋ก ์๋ ค์ง ์์ญ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค๋ฅธ ์ธ์ด์์๋ ๋ฐ์ํ์ง ์๋ ๋ณ์ ์๋์๊ณผ ํฅ๋ฏธ๋ก์ด ์ํธ ์์ฉ์ด ์์ต๋๋ค.
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
์ ์ธ ๋ณ์์ ๊ฒฝ์ฐ ํญ์ ์ฌํ ๋น์ ํตํด ํ์
์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
let a = 1;
a = "foo";
์ฐ์ฐ์
JavaScript์ ์ฐ์ ์ฐ์ฐ์๋ก๋ +
, -
, *
, /
, %
(๋๋จธ์ง ์ฐ์ฐ์), **
(์ง์ ์ฐ์ฐ์)๊ฐ ์์ต๋๋ค. ๊ฐ์ =
์ฐ์ฐ์๋ก ํ ๋นํ ์ ์๊ณ , +=
์ -=
์ ๊ฐ์ ๋ณตํฉ ํ ๋น ์ฐ์ฐ์๋ฅผ ํตํด์๋ ํ ๋นํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์ฐ์ธ ์ฐ์ฐ์๋ x = x ์ฐ์ฐ์ y
์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋
๋๋ค.
x += 5;
x = x + 5;
++
์ --
๋ฅผ ๊ฐ๊ฐ ์ฆ๊ฐ์ ๊ฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ค์ ๋ํ ์ ์ฒ๋ฆฌ ๋๋ ํ์ฒ๋ฆฌ ์ฐ์ฐ์๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
+
์ฐ์ฐ์๋ ๋ฌธ์์ด์ ์ฐ๊ฒฐํฉ๋๋ค.
"hello" + " world"; // "hello world"
์ซ์(๋๋ ๋ค๋ฅธ ๊ฐ)์ ๋ฌธ์์ด์ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋จผ์ ๋ฌธ์์ด๋ก ๋ณํ๋ฉ๋๋ค. ์ด๊ฒ์ ๋น์ ์ ๋์ด๋จ๋ฆด ์ ์์ต๋๋ค.
"3" + 4 + 5; // "345"
3 + 4 + "5"; // "75"
๋ฌด์ธ๊ฐ์ ๋น ๋ฌธ์์ด์ ์ถ๊ฐํ๋ ๊ฒ์ ํด๋น ๊ฐ์ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ์๋ น์ ๋๋ค.
JavaScript์ ๋น๊ต๋ <
, >
, <=
๋ฐ >=
๋ฅผ ์ฌ์ฉํด ๋ง๋ค ์ ์๊ณ , ์ด ์ฐ์ฐ์๋ค์ ๋ฌธ์์ด๊ณผ ์ ์์ชฝ ๋ชจ๋์์ ๋์ํฉ๋๋ค. ๋๋ฑ์ฑ์ ์ํด ์ด์ค ๋ฑํธ ์ฐ์ฐ์๋ ๋ค๋ฅธ ํ์
์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ํ์
๊ฐ์ ๋ณํ์ ์ํํ๋ฉฐ, ๋๋ก๋ ํฅ๋ฏธ๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ฐ๋ฉด์, ์ผ์ค ๋ฑํธ ์ฐ์ฐ์๋ ํ์
๊ฐ์ ๋ณํ์ ์๋ํ์ง ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ ํธํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
123 == "123"; // true
1 == true; // true
123 === "123"; // false
1 === true; // false
์ด์ค ๋ฑํธ์ ์ผ์ค ๋ฑํธ์๋ !=
์ !==
๊ฐ์ ๋ถ๋ฑํธ๋ ์์ต๋๋ค.
JavaScript์๋ ๋นํธ ์ฐ์ฐ์ ๋ฐ ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ์์ต๋๋ค. ํนํ ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก๋ง ์๋ํ์ง ์๊ณ ๊ฐ์ "์ง์ค์ฑ"์ ๋ฐ๋ผ ์๋ํฉ๋๋ค.
const a = 0 && "Hello"; // 0์ "falsy" ์ด๋ผ์, 0์
๋๋ค.
const b = "Hello" || "world"; // "Hello"์ "world" ๋ชจ๋ "truthy"์ด๋ผ์, "Hello" ์
๋๋ค.
&&
๋ฐ ||
์ฐ์ฐ์๋ ๋จ๋ฝ ๋
ผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์๋ฅผ ์คํํ ์ง ์ฌ๋ถ๋ ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ์ด๋ ์์ฑ์ ์ ๊ทผํ๊ธฐ ์ ์ null ๊ฐ์ฒด๋ฅผ ํ์ธํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
const name = o && o.getName();
๋๋ ์บ์ฑ ๊ฐ์ ๊ฒฝ์ฐ(๊ฑฐ์ง ๊ฐ์ด ์ ํจํ์ง ์์ ๊ฒฝ์ฐ)
const name = cachedName || (cachedName = getName());
์ ์ฒด ์ฐ์ฐ์ ๋ชฉ๋ก์ ๊ฐ์ด๋ ํ์ด์ง ๋๋ ์ฐธ์กฐ ์น์ ์ ์ฐธ์กฐํ์ธ์. ํนํ ์ฐ์ฐ์ ์ฐ์ ์์์ ๊ด์ฌ์ด ์์ ์๋ ์์ต๋๋ค.
๋ฌธ๋ฒ
JavaScript ๋ฌธ๋ฒ์ C ๊ณ์ด๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค.
- ์๋ณ์๋ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ง๋ง, ์์ฝ์ด ์ค ํ๋์ผ ์๋ ์์ต๋๋ค.
- ์ฃผ์์ ์ผ๋ฐ์ ์ผ๋ก
//
๋๋/* */
์ ์ฌ์ฉํฉ๋๋ค.#
์ ์ฌ์ฉํ๋ Perl, Python, and Bash์ ๊ฐ์ ๋ค๋ฅธ ๋ง์ ์คํฌ๋ฆฝํ ์ธ์ด์๋ ๋ค๋ฆ ๋๋ค. - ์ธ๋ฏธ์ฝ๋ก ์ JavaScript์์ ์ ํ ์ฌํญ์ ๋๋ค. ์ธ์ด๋ ํ์ํ ๋ ์๋์ผ๋ก ์ฝ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Python๊ณผ ๋ฌ๋ฆฌ ์ธ๋ฏธ์ฝ๋ก ์ ์ฌ์ ํ ๋ฌธ๋ฒ์ ์ผ๋ถ์ด๋ฏ๋ก ์ฃผ์ํด์ผ ํ ์ฌํญ์ด ์์ต๋๋ค.
JavaScript ๋ฌธ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ดํ ๋ฌธ๋ฒ ์ฐธ์กฐ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
์ ์ด ๊ตฌ์กฐ
JavaScript๋ C ๊ณ์ด์ ๋ค๋ฅธ ์ธ์ด๋ค๊ณผ ๋น์ทํ ์ ์ด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์กฐ๊ฑด๋ฌธ์ if
๋ฐ else
๋ก ์ง์๋๋ฉฐ, ํจ๊ป ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
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
๋ฐ๋ณต๋ฌธ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ์๋ ๊ธฐ๋ณธ ๋ฐ๋ณต์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๊ณ , ํ์๋ ๋ฐ๋ณต๋ฌธ์ ์ ์ด๋ ํ๋ฒ ์ด์์ ์คํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
while (true) {
// ๋ฌดํ๋ฃจํ!
}
let input;
do {
input = get_input();
} while (inputIsNotValid(input));
JavaScript์ for
๋ฐ๋ณต๋ฌธ์ C์ Java์ ๋ฐ๋ณต๋ฌธ๊ณผ ๊ฐ์ต๋๋ค. ๋งํ์๋ฉด, ๋ฐ๋ณต๋ฌธ์ ํ์ํ ์ ์ด ์ ๋ณด๋ฅผ ํ ์ค์ ํํํ ์ ์๋ค๋ ์ด์ผ๊ธฐ์ง์.
for (let i = 0; i < 5; i++) {
// ๋ด๋ถ ๋์์ 5๋ฒ ๋ฐ๋ณตํฉ๋๋ค
}
JavaScript์๋ ๋๊ฐ์ ์ค์ํ for ๋ฐ๋ณต๋ฌธ ๋ํ ํฌํจ๋ฉ๋๋ค. iterables(ํนํ ๋ฐฐ์ด)๋ฅผ ๋ฐ๋ณตํ๋ for...of
, ๊ฐ์ฒด์ ๋ชจ๋ enumerable ์์ฑ์ ๋ฐฉ๋ฌธํ๋ for...in
์
๋๋ค.
for (const value of array) {
// value๋ก ์์
์ํํฉ๋๋ค.
}
for (const property in object) {
// ๊ฐ์ฒด ํ๋กํผํฐ๋ก ์์
์ํํฉ๋๋ค.
}
switch
๋ฌธ์ ๋๋ฑ ๊ฒ์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๋ถ๊ธฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
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
๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋ฉ๋๋ค.
try {
buildMySite("./website");
} catch (e) {
console.error("Building site failed:", e);
}
์๋ฌ(Error)๋ throw
๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ง์ ๊ธฐ๋ณธ ์ ๊ณต ์์
๋ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
function buildMySite(siteDirectory) {
if (!pathExists(siteDirectory)) {
throw new Error("Site directory does not exist");
}
}
์ผ๋ฐ์ ์ผ๋ก, ๋ฐฉ๊ธ ์ก์ ์ค๋ฅ์ ํ์
์ ์ ์ ์์ต๋๋ค. throw
๋ฌธ์์ ๋ฌด์์ด๋ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ์์ ๊ฐ์ด Error
์ธ์คํด์ค๋ผ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. TypeError
๋ฐ RangeError
์ ๊ฐ์ Error
๋ด์ฅ ํ์ ํด๋์ค๊ฐ ์๋๋ฐ, ์ค๋ฅ์ ๋ํ ์ถ๊ฐ์ ์ธ ์๋ฏธ์ฒด๊ณ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. JavaScript์๋ ์กฐ๊ฑด๋ถ ํฌ์ฐฉ์ด ์์ต๋๋ค. ํ ๊ฐ์ง์ ํ์
์ ์ค๋ฅ๋ง ์ฒ๋ฆฌํ๋ ค๋ฉด, ๋ชจ๋ ๊ฒ์ ํฌ์ฐฉํ๊ณ instanceof
๋ฅผ ์ฌ์ฉํด ์ค๋ฅ ํ์
์ ์๋ณํด์ผ ํ๊ณ , ๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ case๋ฅผ ๋ค์ ๋์ ธ์ผ ํฉ๋๋ค.
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)์ ๋๋ค. ์ ์์ธ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ ์ค์ ๋ก๋ ๋ฌธ์์ด์ ๋๋ค.
๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค.
const obj = {
name: "Carrot",
for: "Max",
details: {
color: "orange",
size: 12,
},
};
๊ฐ์ฒด ์์ฑ์ ์ (.
) ๋๋ ๋๊ดํธ([]
)๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ ๋, ํค๋ ์ ํจํ ์๋ณ์์ฌ์ผ ํฉ๋๋ค. ๋ฐ๋ฉด ๋๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ํค ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ธ๋ฑ์ฑํ ์ ์์ต๋๋ค.
// ์ ํ๊ธฐ๋ฒ
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?");
์์ฑ ์ ๊ทผ์ ํจ๊ป ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
obj.details.color; // orange
obj["details"]["size"]; // 12
๊ฐ์ฒด๋ ํญ์ ์ฐธ์กฐ์ด๋ฏ๋ก, ๋ฌด์ธ๊ฐ ๋ช ์์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ์ง ์๋ ํ, ๊ฐ์ฒด์ ๋ํ ๋ณํ์ ์ธ๋ถ์์ ๋ณผ ์ ์์ต๋๋ค.
const obj = {};
function doSomething(o) {
o.x = 1;
}
doSomething(obj);
console.log(obj.x); // 1
์ด๋ ๋ํ ๋ณ๋๋ก ์์ฑ๋ ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ์ฝ ๊ฐ์ง ์์(!==
)์ ์๋ฏธํฉ๋๋ค. ๋์ผํ ๊ฐ์ฒด์ ๋ํ ๋ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ๊ฒฝ์ฐ, ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ํ๋๋ฅผ ํตํด ๊ด์ฐฐํ ์ ์์ต๋๋ค.
const me = {};
const stillMe = me;
me.x = 1;
console.log(stillMe.x); // 1
๊ฐ์ฒด ๋ฐ ํ๋กํ ํ์
์ ๋ํ ์์ธํ ๋ด์ฉ์, ๊ฐ์ฒด
์ฐธ์กฐ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์. ๊ฐ์ฒด ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฐธ์กฐ ํ์ด์ง๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ผ๋ฐ์ ์ผ๋ก (๋ํดํ๋ค๊ณ ๋ค์์ ์ ์๋) ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋ฌ์ฑํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด ํ์ด์ง์์๋ ๊ฐ์ฒด ํ๋กํ ํ์ ๋ฐ ์์์ ๋ํ ๋ชจ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ์๋ตํ์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์์ ๋ฐ ํ๋กํ ํ์ ์ฒด์ธ์ ์ฐธ์กฐํ์ธ์.
๋ฐฐ์ด (Arrays)
JavaScript์์ ๋ฐฐ์ด์ ์ค์ ๋ก๋ ํน๋ณํ ํ์
์ ๊ฐ์ฒด์
๋๋ค. (์ซ์๋ก ๋ํ๋ธ ์์ฑ์ ์์ฐ์ค๋ฝ๊ฒ []
๊ตฌ๋ฌธ๋ง์ ์ฌ์ฉํด์ ์ ๊ทผํ๊ฒ ๋๋ฏ๋ก) ์ผ๋ฐ ๊ฐ์ฒด์ ๋ง์ด ๋น์ทํ๊ฒ ๋์ํ์ง๋ง, ์ด ๊ฐ์ฒด๋ length
๋ผ๋ ํ๊ฐ์ง ๋ง๋ฒ์ ์ธ ์์ฑ์ ๊ฐ์ง๋๋ค. ์ด๋ ํญ์ ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ์ธ๋ฑ์ค๋ณด๋ค ํ๋ ๋ ํฐ ๊ฐ์ ๊ฐ์ง๋๋ค.
๋ฐฐ์ด์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด ๋ฆฌํฐ๋ด๋ก ์์ฑ๋ฉ๋๋ค.
const a = ["dog", "cat", "hen"];
a.length; // 3
JavaScript ๋ฐฐ์ด์ ์ฌ์ ํ ๊ฐ์ฒด์
๋๋ค. ์์์ ์ซ์ ์ธ๋ฑ์ค๋ฅผ ํฌํจํ์ฌ ๋ฐฐ์ด์ ์์ฑ์ ํ ๋นํ ์ ์์ต๋๋ค. ์ ์ผํ "๋ง๋ฒ"์ ํน์ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ ๋ length
๊ฐ ์๋์ผ๋ก ์
๋ฐ์ดํธ ๋๋ค๋ ๊ฒ์
๋๋ค.
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
๊ฐ์ด ๋ฐํ๋ฉ๋๋ค.
const a = ["dog", "cat", "hen"];
console.log(typeof a[90]); // undefined
๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ ์์๋ก ํ์ฅํ๊ฑฐ๋ ์ถ์ํ ์ ์์ต๋๋ค.
const arr = [1, "foo", true];
arr.push({});
// arr = [1, "foo", true, {}]
๋ฐฐ์ด์ ๋ค๋ฅธ C ์ ์ฌ ์ธ์ด์์์ ๋ง์ฐฌ๊ฐ์ง๋ก for
๋ฃจํ๋ก ๋ฐ๋ณต๋ ์ ์์ต๋๋ค.
for (let i = 0; i < a.length; i++) {
// a[i]์ ๊ฐ์ง๊ณ ์์
์งํ
}
๋ฐฐ์ด์ ๋ํ ๋ฐ๋ณต ๊ฐ๋ฅํ๋ฏ๋ก, C++/Java์ for (int x : arr)
๋ฌธ๋ฒ์ ๋์ผํ for...of
๋ฃจํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
for (const currentValue of a) {
// currentValue๋ฅผ ๊ฐ์ง๊ณ ์์
์งํ
}
๋ฐฐ์ด์๋ ๋ฐฐ์ด ๋ฉ์๋๊ฐ ๋ง์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ๋ฐฐ์ด์ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, map()
์ ๋ชจ๋ ๋ฐฐ์ด ์์์ ์ฝ๋ฐฑ์ ์ ์ฉํ๊ณ ์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
const babies = ["dog", "cat", "hen"].map((name) => `baby ${name}`);
// babies = ['baby dog', 'baby cat', 'baby hen']
ํจ์ (Functions)
๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก, ํจ์๋ JavaScript๋ฅผ ์ดํดํ๋๋ฐ ํต์ฌ์ด ๋๋ ์ปดํฌ๋ํธ์ ๋๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํจ์์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function add(x, y) {
const total = x + y;
return total;
}
JavaScript ํจ์๋ 0๊ฐ ์ด์์ ์ด๋ฆ์ด ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ํจ์์ ๋ณธ์ฒด์๋ ์ํ๋ ๋งํผ ๊ตฌ๋ฌธ์ ์์ฑํ ์ ์๊ณ ํด๋น ํจ์์ ์ง์ญ์ ์ธ ๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. return
๋ฌธ์ ์ธ์ ๋ ์ง ๊ฐ์ ๋ฐํํ๊ณ ํจ์๋ฅผ ์ข
๋ฃํ ์ ์์ต๋๋ค. ๋ฐํ ๋ฌธ์ด ์์ผ๋ฉด (ํน์ ๊ฐ์ด ์๋ ๋ฐํ์ด ์ฌ์ฉ๋๋ฉด), JavaScript๋ undefined
์ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๋ก ์ง์ ๋ ๊ฒ๋ณด๋ค ๋ง๊ฑฐ๋ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํด์๋ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์์๋๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ์ง ์๊ณ ํจ์๋ฅผ ํธ์ถํ๋ฉด undefined
๋ก ์ค์ ๋ฉ๋๋ค. ์์๋ณด๋ค ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ฉด ์ถ๊ฐ๋ก ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฌด์ํฉ๋๋ค.
add(); // NaN
// add(undefined, undefined)์ ๋๋ฑํฉ๋๋ค.
add(2, 3, 4); // 5
// ์ฒ์์ ๋ ์๊ฐ ๋ํด์ง๋๋ค. 4๋ ๋ฌด์๋ฉ๋๋ค.
์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ์ฌ๋ฌ ๋งค๊ฐ๋ณ์ ๊ตฌ๋ฌธ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, rest ๋งค๊ฐ๋ณ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด Python์ *args
์ ์ ์ฌํ๊ฒ ํธ์ถ์๊ฐ ์ ๋ฌํ ๋ชจ๋ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐฐ์ด๋ก ์์งํ ์ ์์ต๋๋ค(JS๋ ์ธ์ด ์์ค์์ ๋ช
๋ช
๋ ๋งค๊ฐ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์, **kwargs
๊ฐ ์์ต๋๋ค).
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์๋ ๋ช ๋ช ๋ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ํ์ง๋ง ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌํ๊ฒ ํ๋๋ก ํฉ์น๊ณ , ๋ถํดํ ์ ์๋ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
// ์ค๊ดํธ({ })์ ์ ์ํ์ธ์. ๊ฐ์ฒด๋ฅผ ๋ถํดํฉ๋๋ค.
function area({ width, height }) {
return width * height;
}
// ์ฌ๊ธฐ์ ์ค๊ดํธ({ })๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
console.log(area({ width: 2, height: 3 }));
๊ธฐ๋ณธ๊ฐ ๋งค๊ฐ๋ณ์ ๊ตฌ๋ฌธ๋ ์๋๋ฐ, ์๋ต๋ ๋งค๊ฐ๋ณ์(๋๋ undefined
๋ก ์ ๋ฌ๋ ๋งค๊ฐ๋ณ์)๊ฐ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ๋๋ก ํ์ฉํฉ๋๋ค.
function avg(firstValue, secondValue, thirdValue = 0) {
return (firstValue + secondValue + thirdValue) / 3;
}
avg(1, 2); // NaN ๋์ , 1์
๋๋ค.
์ต๋ช ํจ์
JavaScript์์๋ ์ต๋ช ํจ์(์ด๋ฆ์ด ์๋ ํจ์)๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ค์ ๋ก, ์ด๋ฐ ์ด๋ฆ์๋ ํจ์๋ค์ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ณ์์ ์ฆ์ ํ ๋น๋๊ฑฐ๋ ๋ค๋ฅธ ํจ์์์ ๋ฐํ๋ฉ๋๋ค.
// ๊ดํธ ์์ ํจ์๋ช
์ด ์์์ ์ฃผ๋ชฉํด์ฃผ์ธ์.
const avg = function (...args) {
let sum = 0;
for (const item of args) {
sum += item;
}
return sum / args.length;
};
์์ ์ ์๋ ์ต๋ช
ํจ์๋ ์ธ์์ ํจ๊ป avg()
์ ๊ฐ์ ํํ๋ก ์คํํ ์ ์์ต๋๋ค. ์ฆ, function avg() {}
์ ๊ฐ์ด ์ด๋ฆ์ ๋ถ์ธ ํจ์ ์ ์ธ๊ณผ ์๋ฏธ์ ์ผ๋ก ๊ฐ์ต๋๋ค.
ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋ช ํจ์๋ฅผ ์ ์ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
// ๊ดํธ ์์ ํจ์๋ช
์ด ์์์ ์ฃผ๋ชฉํด์ฃผ์ธ์.
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)์ด๋ผ๋ ๋จ์ผ ํํ์์์ ์ต๋ช ํจ์๋ฅผ ๋์์ ์ ์ธํ๊ณ ํธ์ถํ ์ ์์ต๋๋ค.
(function () {
// โฆ
})();
IIFE์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด์๋ ํด๋ก์ ๋ฅผ ์ด์ฉํด์ ํ๋ผ์ด๋น ๋ฉ์๋ ํ๋ด๋ด๊ธฐ์ ์ฐธ์กฐํ์ธ์.
์ฌ๊ท ํจ์
JavaScript๋ ์ฌ๊ท์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ DOM ๋ฑ์์ ๋ณผ ์ ์๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ ์ฉํฉ๋๋ค.
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;
}
ํจ์ ํํ์์๋ ์ด๋ฆ์ ์ง์ ํ ์ ์์ผ๋ฏ๋ก, ์ฌ๊ท์ ์ผ ์ ์์ต๋๋ค.
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)๋ฅผ ์ง์ํ๋ฏ๋ก ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ํธ๋ฆฌํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
// ํจ์๋ฅผ ๋ฐํํ๋ ํจ์
const add = (x) => (y) => x + y;
// ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์
const babies = ["dog", "cat", "hen"].map((name) => `baby ${name}`);
JavaScript ํจ์๋ JavaScript์ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ทธ ์์ฒด๋ก ๊ฐ์ฒด์ด๋ฉฐ, ์ด์ ๊ฐ์ฒด ์น์ ์์ ๋ณธ ๊ฒ์ฒ๋ผ ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ด์ฅ ํจ์ (Inner functions)
JavaScript์ ํจ์ ์ ์ธ์ ๋ค๋ฅธ ํจ์ ๋ด๋ถ์์๋ ๊ฐ๋ฅํฉ๋๋ค. JavaScript์ ์ค์ฒฉ ํจ์์์๋ ๋ถ๋ชจ ํจ์ ๋ฒ์์ ์๋ ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ ์ค์ํฉ๋๋ค.
function parentFunc() {
const a = 1;
function nestedFunc() {
const b = 4; // parentFunc์ ์ฌ์ฉํ ์ ์๋ ๋ณ์
return a + b;
}
return nestedFunc(); // 5
}
์ด๋ฐ ํน์ฑ์ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ์ฝ๋๋ฅผ ๋ง๋๋๋ฐ ๋์์ด ๋ฉ๋๋ค. ํธ์ถ๋ ํจ์๊ฐ ๋ค๋ฅธ ํ๋ ๊ฐ์ ํจ์์์๋ง ํธ์ถ๋๋ฉฐ ๊ทธ ์ธ์ ๋ค๋ฅธ ์ฝ๋์์๋ ์ฌ์ฉ์ด ์๋๋ ๊ฒฝ์ฐ, ํด๋น ํจ์๋ฅผ ๋ด๋ถ์ ์ค์ฒฉ์ํฌ ์ ์์ต๋๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ํตํด ์ ์ญ ๋ฒ์์ ํจ์์ ๊ฐ์๊ฐ ์ค์ด๋ญ๋๋ค.
๋ํ ์ ์ญ ๋ณ์์ ๋ํ ์ ํน์ ๋ฟ๋ฆฌ์น ์ ์๋ ์ข์ ๋์์ด ๋ฉ๋๋ค. ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋ ๋๋ฉด ์ฌ๋ฌ ํจ์๋ค ๊ฐ์ ๊ฐ์ ๊ณต์ ํ๊ธฐ ์ํ ์ฉ๋๋ก ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ด์ง์ง๋ง, ์ ์ญ ๋ณ์๋ ์ ์ง๋ณด์๋ฅผ ํ๋ค๊ฒ ํฉ๋๋ค. ์ด๋ฐ ์ํฉ์ ์ค์ฒฉ ํจ์๋ ๋ถ๋ชจ์ ๋ณ์๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ์ ์ญ ์ด๋ฆ๊ณต๊ฐ์ ๋๋ฝํ์ง ์๊ณ ํจ์๋ค์ ์ฐ๋ํ ์ ์์ต๋๋ค.
ํด๋์ค
JavaScript๋ Java์ ๋งค์ฐ ์ ์ฌํ class ๋ฌธ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
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)์ด๋ผ๊ณ ํฉ๋๋ค.
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์์ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ ์ ์์ต๋๋ค.
// ์ฝ๋ฐฑ ๊ธฐ๋ฐ(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
๋ฅผ ๋ชจ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ๋ช
๋ น๋ฌธ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
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 ์ฐธ๊ณ ์์ ๋ํด ์ฝ์ด๋ณด์ธ์.
์์ฑ ๊ณต๊ฐ๊ณผ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ์๋ต๋ ์ธ์ด์ ์ผ๋ถ ํ์ ๋ถ๋ถ์ด ์์ง๋ง, ์ง์ ์ฐพ์๋ณผ ์ ์์ต๋๋ค.