Best Practices for Using Modern JavaScript Syntax - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์ต์ JavaScript ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๋ชจ๋ฒ ์ฌ๋ก
์ด ๊ธฐ์ฌ๋ ์ฐ๋ฆฌ์ ์ฑ (JavaScript : Best Practice)์ ์๊ฐ๋์ด ์์ต๋๋ค. ์ต์ JavaScript์ ๊ธ๋ณํ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์งํ์ญ์์ค.
์ต์ JavaScript๋ ์๋ก์ด ํ๋ ์์ํฌ ๋ฐ ํ๊ฒฝ์ ๋ณํํ๋ ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ ์ํด ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ฉด ์๊ฐ์ ์ ์ฝํ๊ณ ๊ธฐ์ ์ ํฅ์ ์ํค๋ฉฐ ์ข์ ์ฝ๋์ ํ๋ฅญํ ์ฝ๋์ ์ฐจ์ด๋ฅผ ํ์ ํ ์ ์์ต๋๋ค.
์ต์ JavaScript๊ฐ ๋ฌด์์ํ๋ ค๊ณ ํ๋์ง ์๋ฉด ์๋ก์ด ๊ตฌ๋ฌธ์ ๊ฐ์ฅ ์ ๋ฆฌํ๊ฒ ์ฌ์ฉํ ๋์ ๊ธฐ์กด ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ์๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
๋ญ๊ฐ์ ์ง์ฐฉํ๋ ๊ฒ
์์ฆ JavaScript๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋ ํ๋์ ์ฝ๋๋ฅผ ์์ฑํด์จ ์ฌ๋์ด๋ , JavaScript ์ํ์ ํผ๋์ค๋ฌ์ํ๋ ์ฌ๋์ ์์ต๋๋ค. ์๋ง์ ์๋ก์ด ํ๋ ์ ์ํฌ, ์ธ์ด์ ๋ํ ๋ง์ ๋ณํ, ๊ทธ๋ฆฌ๊ณ ๊ณ ๋ คํด์ผ ํ ๋ง์ ๋งฅ๋ฝ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋งค๋ฌ ๋ฐฐ์์ผ ํ ๋ชจ๋ ์๋ก์ด ๊ฒ๋ค์ ๊ฐ์ง๊ณ ๋๊ตฌ๋ ์ด๋ค ์ผ์ ํด๋ด๊ฒ ๋๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ฌด๋ฆฌ ๋ณต์กํ๋๋ผ๋ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ฑ๊ณตํ๋ ๋น๊ฒฐ์ ๊ธฐ๋ณธ์ผ๋ก ๋์๊ฐ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Rails๋ฅผ ์ดํดํ๋ ค๋ฉด ๋จผ์ Ruby ๊ธฐ์ ์ ์ตํ๊ณ , isomorphic React์์ ๋ถ๋ณ์ฑ ๋ฐ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ webpack์ ์ฌ์ฉํ์ฌ(๋๋ ์์ฆ ์์ํ ๊ดด์ง๋ค์ด ์ํํ๋ ์์ (or whatever the cool nerds are doing these days)) ํต์ฌ JavaScript๋ฅผ ์์์ผํฉ๋๋ค.
์ธ์ด ์์ฒด์ ์๋ ๋ฐฉ์์ ์ดํดํ๋ ๊ฒ์ ์ต์ ํ๋ ์ ์ํฌ์ ํ๊ฒฝ์ ์ต์ํด์ง๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ค์ฉ์ ์ ๋๋ค. ์ฌ์ง์ด ๋ ์จ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ณํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ JavaScript๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์จ๋ผ์ธ์์ JavaScript๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด์ก๋์ง, ์ด๋ป๊ฒ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋์ง์ ๋ํ ์ฌ๋ ค ๊น์ ์ ๋ณด๊ฐ ์ค๋ ์ ๋ถํฐ ์์ต๋๋ค.
๋ฌธ์ ๋ ์ต์ ๋ฒ์ ์ JavaScript์ ํจ๊ป ์ ๊ณต๋ ์๋ก์ด ๊ธฐ์ ์ค ์ผ๋ถ๋ ๊ธฐ์กด ๊ท์น ์ผ๋ถ๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ทธ๋ฐ๊ฑด ์๋๋๋ค! ๋๋ก๋ ์๋ก์ด ๊ตฌ๋ฌธ์ด ๋ณต์กํ ์์ ์ ๋์ฒดํ์ฌ ๋์ผํ ์์ ์ ์ํ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์๋ก์ด ์ ๊ทผ ๋ฐฉ์์ด ๊ธฐ์กด ๋ฐฉ์์ ๋์ฒดํ๋ ๊ฐ๋จํ ๋์ฒด ๋ฐฉ์์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ผ๋ฏ๋ก ๊ทธ ์ ์ ์ธ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
Syntactic Sugar ํ์คํผ
์ต๊ทผ ๋ช๋
๋์ JavaScript์ ๋ง์ ๋ณํ๊ฐ ๊ธฐ์กด ๊ตฌ๋ฌธ์ ๋ํ Syntactic Sugar๋ก ๋ฌ์ฌ๋์์ต๋๋ค.
๋ง์ ๊ฒฝ์ฐ์, Syntactic Sugar๋ ์๋ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ JavaScript๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๋ฐ ๋์์ด ๋ ์ ์๊ฑฐ๋, ๋๋จธ์ง ์ฌ๋๋ค์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์๊ณ ์๋ ์ผ์ ์ฑ์ทจํ๊ธฐ ์ํ ๋ ๊นจ๋ํ๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ํ ๋ฟ์
๋๋ค. ๋ค๋ฅธ ๋ณํ๋ค์ ๋ง๋ฒ์ ์๋ก์ด ๋ฅ๋ ฅ์ ๋์
ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
๊ทธ๋ฌ๋ ํ๋์ ์ธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ํ ์ค๋๋ ๊ธฐ์ ์ ๋ค์ ๋ง๋ค๊ฑฐ๋ ์ค์ ๋ก ์๋ํ๋ ๋ฐฉ์์ ์ดํดํ์ง ์๊ณ ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ํ์ด ์์ต๋๋ค.
- ์ด์ ์ ์๋ฒฝํ๊ฒ ์๋ ํ ์ฝ๋๋ฅผ ๋๋ฒ๊น ํด์ผ ํจ
- ๋ฐํ์์ ์ก์ ์ ์๋ ๋ฏธ๋ฌํ ์ค์๋ฅผ ์๊ฐ
- ์์ํ์ง ๋ชปํ ๊ฒฝ์ฐ ์คํจํ๋ ์ฝ๋ ์์ฑ
์ฌ์ค, ๊ธฐ์กด ๊ธฐ์ ์ ๋์ฒด ํ ์์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ ๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ๋์ฒด ํ ์ฝ๋์ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋์ ์ค๋๋ ์คํ์ผ์ ์ฌ์ฉํ์ฌ ์ํํ๋ ค๋ ์์ ์ ์ํํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ ๋๋ค. ํจ๊ณผ์ ์ธ ์ต์ JavaScript๋ฅผ ์์ฑํ๋ ค๋ฉด ์ด๋ฌํ ์ํฉ์ด ์ธ์ ์ธ์ง ์ธ์ํ๊ณ ์ ํ ๋ฐฉ๋ฒ์ ์์์ผํฉ๋๋ค.
const
๊ฐ ์ผ๊ด์ฑ์ด ์์ ๋
๋น์ ์ ์ต์ JavaScript๋ let
๊ณผ const
๋ผ๋ ๋ ๊ฐ์ง ์๋ก์ด ํค์๋๋ฅผ ๋์
ํ์ฌ ๋๋ถ๋ถ์ ๋ณ์ ์ ์ธ์ var
์ ํ์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๋์ฒดํฉ๋๋ค. ๊ทธ๋ฌ๋ var
์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ์ง๋ ์์ต๋๋ค.
๊ธฐ์กด JavaScript์์๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ var
ํค์๋๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ํญ์ ๊นจ๋ํ ์ฝ๋ฉ ๊ดํ์ด์์ต๋๋ค. ๊ทธ๋ ๊ฒํ์ง ์์ผ๋ฉด ์ ์ธ ํ ๋ณ์์ ๋์ผํ ์ปจํ
์คํธ์์ ์คํ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ ์ญ ์ค์ฝํ์์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด JavaScript๋ ์ฌ๋ฌ ์คํฌ๋ฆฝํธ๊ฐ ๋์์ ๋ก๋ ๋ ์์๋ ์น ํ์ด์ง์์ ์์ฃผ ์คํ ๋์๊ธฐ ๋๋ฌธ์ ํ ์คํฌ๋ฆฝํธ์์ ์ ์ธ ๋ ๋ณ์๊ฐ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ก ๋์ถ๋ ์ ์์ต๋๋ค.
์ต์ JavaScript์์ var
๋ฅผ ๊ฐ์ฅ ๊นจ๋ํ๊ฒ ๋๋กญ ์ธ ๋์ฒด ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ var
์ ๊ตฌ๋ณ๋๋ ๋ช ๊ฐ์ง ํน์ฑ์ด ์์ต๋๋ค. var
๋ฅผ ์ฌ์ฉํ๋ ๋ณ์ ์ ์ธ์ ํด๋น ์ค์ฝํ ๋ด๋ถ์ ๋ฐฐ์น ๋ ์์น์ ๊ด๊ณ์์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋ ์ค์ฝํ์ ์๋จ์ ํญ์ ์ฌ๋ ค์ ธ ์์ต๋๋ค. ์ฆ, ๊น์ด ์ค์ฒฉ ๋ ๋ณ์์กฐ์ฐจ๋ ํฌํจ๋ ์ค์ฝํ์ ์์ ๋ถ๋ถ์์ ์ ์ธ๋๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ ๋ ์ ์์ต๋๋ค. let
๋๋ const
๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
console.log(usingVar); // undefined
var usingVar = "defined";
console.log(usingVar); // "defined"
console.log(usingLet); // error
let usingLet = "defined"; // never gets executed
console.log(usingLet); // never gets executed
let
๋๋ const
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํด๋น ๋ณ์์ ์ค์ฝํ๋ ์ ์ธ ๋ ๋ก์ปฌ ๋ธ๋ก์ผ๋ก ์ ํ๋ฉ๋๋ค. JavaScript์ ๋ธ๋ก์ ํจ์ ๋ณธ๋ฌธ ๋๋ ๋ฃจํ ๋ด์ ์คํ ์ฝ๋์ ๊ฐ์ ์ค๊ดํธ {}
๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
์ด๋ ๋ฐ๋ณต์ ๋ฐ ๋ฃจํ์ ๊ฐ์ ๋ณ์์ ๋ธ๋ก ์ค์ฝํ ์ฌ์ฉ์ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ด์ ์๋ ๋ฃจํ ๋ด์์ ์ ์ธ ๋ ๋ณ์๋ฅผ ํฌํจํ๋ ์ค์ฝํ์์ ์ฌ์ฉํ ์ ์์์ผ๋ฏ๋ก ์ฌ๋ฌ ์นด์ดํฐ๊ฐ ๋์ผํ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ํผ๋ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์คํฌ๋ฆฝํธ์ ํ ๋ธ๋ก ๋ด์์ ์ ์ธ ๋ ๋ณ์๊ฐ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ค๋ฉด let
์ ๋น์ ์ ์ก์ ์ ์์ต๋๋ค.
for (var count = 0; count < 5; count++) {
console.log(count);
} // outputs the numbers 0 - 4 to the console
console.log(count); // 5
for (let otherCount = 0; otherCount < 5; otherCount++) {
console.log(otherCount);
} // outputs the numbers 0 - 4 to the console
console.log(otherCount); // error, otherCount is undefined
๋ค๋ฅธ ๋์ฒด ์ ์ธ์ const
์ด๋ฉฐ ์์๋ฅผ ๋ํ๋
๋๋ค. ๊ทธ๋ฌ๋ ์์ ํ ์ผ์ ํ์ง๋ ์์ต๋๋ค.
์ด ๋ณ์๋ var
๋๋ let
๋ณ์์ ๋ฌ๋ฆฌ ๊ฐ์์ด ์ ์ธ ํ ์ ์์ต๋๋ค.
var x; // valid
let y; //valid
const z; // error
const
์ ์ธ ๋ ํ์ ์๋ก์ด ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
const z = 3; // valid
z = 4; // error
๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ const
๊ฐ ๋ถ๋ณ์ธ ๊ฒ์ผ๋ก ์์ํ ๊ฒฝ์ฐ const
๋ก ์ ์ธ ๋ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ด ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ฉด ๊น์ง ๋๋ ์ ์์ต๋๋ค.
const z = []; // valid
z.push(1); // valid, and z is now [1]
z = [2] // error
์ด๋ฐ ์ด์ ๋ก, ์ฌ๋๋ค์ด ์ ์ธ ๋ ํ์๋ ์ ๋๋ก ๋ณ๊ฒฝํ์ง ์์ผ๋ ค๋ ์๋๋ฅผ ๊ฐ์ง๊ณ ์์๋ ๋ชจ๋ ๋ณ์ ์ ์ธ์ ๋ํด var
๋์ const
์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ณ์๋ฅผ ๋ณ๊ฒฝํ ์์๋ ๊ฒ์ผ๋ก ์ทจ๊ธํ๋ ๊ฒ์ด ์ข์ง๋ง JavaScript๋ ์ธ๋ถ ์คํฌ๋ฆฝํธ์ ๋์์์ด const
๋ก ์ ์ธ๋ ๋ฐฐ์ด ๋ฐ ๊ฐ์ฒด์ ๊ฐ์ ์ฐธ์กฐ ๋ณ์์ ๋ด์ฉ์ ๋ํด์๋ ์ด๋ฅผ ์ ์ฉํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ const
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ ๋
์์ JavaScript ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ณดํธ๋ฅผ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
์ด๊ธฐํํ๊ณ ๋ณ๊ฒฝํ๊ณ ์ถ์ง ์์ ๊ฐ๋จํ ์ซ์ ๋๋ ๋ฌธ์์ด ๋ณ์, ํ ๋ฒ ์ ์ ํ ๋ค์ ์์ ์ ์ํด ๋ซ์๋๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ ์ด๋ฆ์ด ์ง์ ๋ ํจ์ ๋ฐ ํด๋์ค์ const
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋ถ๋ถ์ ๋ณ์ ์ ์ธ์ let
์ ์ฌ์ฉํฉ๋๋ค. ํนํ ์ ์ธ ๋ ๋ฒ์์ ์ํด ๊ฒฝ๊ณ๋ฅผ ์ ํฉ๋๋ค. ์ต๊ทผ์ var
๋ฅผ ์ฌ์ฉํด์ผ ํ ํ์์ฑ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ์ง๋ง ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ณ ์คํฌ๋ฆฝํธ ์๋จ์ ์ค๋ฅด๋ ์ ์ธ์ ์ํ๋ค๋ฉด ๊ทธ๋ ๊ฒํด์ผํฉ๋๋ค.
ํจ์ ์ค์ฝํ ์ ํ
function
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ๋ ๊ธฐ์กด ํจ์๋ ํธ์ถ ๋ ๋งค๊ฐ ๋ณ์์ ๋ํด ๋ธ๋ก ๋ด์ ์ ์ ๋ ์ผ๋ จ์ ๋ช
๋ น๋ฌธ์ ์คํํ๊ณ ์ ํ์ ์ผ๋ก ๊ฐ์ ๋ฆฌํดํ๋๋ก ํธ์ถ ํ ์ ์์ต๋๋ค.
function doSomething(param) {
return(`Did it: ${param}`);
}
console.log(doSomething("Hello")); // "Did it: Hello"
๋ํ new
ํค์๋์ ํจ๊ป ํ๋กํ ํ์
์์์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑ ํ ์ ์์ผ๋ฉฐ, ๊ทธ ์ ์๋ ํธ์ถ ๋ ์์๋ ์ค์ฝํ ๋ด ์ด๋ ๊ณณ์ ๋ ๋ฐฐ์น ํ ์ ์์ต๋๋ค.
function Animal(name) {
this.name = name;
}
let cat = new Animal("Fluffy");
console.log(`My cat's name is ${cat.name}.`); // "My cat's name is Fluffy."
์ด๋ฌํ ๋ฐฉ์ ์ค ํ๋๋ก ์ฌ์ฉ๋๋ ํจ์๋ ํธ์ถ ์ ํ์ ์ ์ ํ ์ ์์ต๋๋ค. JavaScript๋ ์ค์ํ์ง ์์ต๋๋ค.
console.log(doSomething("Hello")); // "Did it: Hello"
let cat = new Animal("Fluffy");
console.log(`My cat's name is ${cat.name}.`); // "My cat's name is Fluffy."
function doSomething(param) {
return(`Did it: ${param}`);
}
function Animal(name) {
this.name = name;
}
๊ธฐ์กด ํจ์๋ ๊ณ ์ ํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ช ๋ น๋ฌธ ๋ณธ๋ฌธ์ ์ค์ฝํ ๋ด์์๋ง ์กด์ฌํ๋ ๊ฐ์ ์ ์ํฉ๋๋ค. ๊ทธ ์์ ์ ์๋ ๋ช ๋ น๋ฌธ์ด๋ ํ์ ํจ์๊ฐ ์คํ ์ค์ด๋ฉฐ ์ ํ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถ ํ ๋ ์ด์ ๋ํ ๊ฐ์ ๋ฐ์ธ๋ฉ ํ ์ ์์ต๋๋ค.
์ด๋ ํค์๋๊ฐ ๋ง์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ํ์๋ก ํ๋ ๊ฒ ์ด์์ ๋๋ค. ๋ฐ๋ผ์ ์ต์ JavaScript๋ ๊ธฐ์กด ํจ์์ ๋์์ ํ์ดํ ํจ์์ ํด๋์ค๋ก ๋ถ๋ฆฌํฉ๋๋ค.
Getting to Class on Time
๊ธฐ์กด function
์ ์ผ๋ถ๋ class
ํค์๋์ ์ํด ์ธ์๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋๋จธ๋ ํธ์ถ ๊ฐ๋ฅํ ํ์ดํ ํจ์๋ก ๋ณด๋ค ๊ธฐ๋ฅ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋ฐ๋ฅด๊ฑฐ๋ ํด๋์ค์ ํจ๊ป ๋ณด๋ค ๊ฐ์ฒด ์งํฅ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ํจ์์ ํ๋กํ ํ์
์์์ ๋์ฒดํ ์ง ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
JavaScript์ ํด๋์ค๋ ๋ค๋ฅธ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ๊ฐ๋จํ ํด๋์ค์ ๋งค์ฐ ์ ์ฌํ๊ฒ ๋ณด์ด๊ณ ์๋ํ๋ฉฐ JavaScript๊ฐ ์๋ฒ๋ก ํ์ฅ ๋จ์ ๋ฐ๋ผ Java ๋ฐ C ++ ๊ฐ๋ฐ์์๊ฒ๋ ์ฌ์ด ๋๋ค๋์ด ๋ ์ ์์ต๋๋ค.
JavaScript์์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ ๋ ํจ์์ ํด๋์ค์ ํ ๊ฐ์ง ์ฐจ์ด์ ์ JavaScript์ ํด๋์ค๋ C++์์์ ๊ฐ์ด (Java์์๋ ์๋์ง๋ง) ์๋ฐฉํฅ ์ ์ธ์ด ํ์ํ๋ค๋ ๊ฒ์
๋๋ค. ์ฆ, new
ํค์๋๋ก ์ธ์คํด์คํํ๊ธฐ ์ ์ ์คํฌ๋ฆฝํธ์์ class
๋ฅผ ์ ์ธํด์ผํฉ๋๋ค. function
ํค์๋๋ฅผ ์ฌ์ฉํ ํ๋กํ ํ์
์์์ ์คํฌ๋ฆฝํธ์์ ๋์ค์ ์ ์ํ๋๋ผ๋ JavaScript์์ ์๋ํฉ๋๋ค. function
์ ์ธ์ class
์๋ ๋ฌ๋ฆฌ ์๋์ผ๋ก ๋งจ ์๋ก ์ฌ๋ผ ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
// Using a function to declare and instantiate an object (hoisted)
let aProto = new Proto("Myra");
aProto.greet(); // "Hi Myra"
function Proto(name) {
this.name = name;
this.greet = function() {
console.log(`Hi ${this.name}`);
};
};
// Using a class to declare and instantiate an object (not hoisted)
class Classy {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hi ${this.name}`);
}
};
let aClassy = new Classy("Sonja");
aClassy.greet(); // "Hi Sonja"
ํ์ดํ ํจ์์์ ์ฐจ์ด์
๊ธฐ์กด ํจ์์ ๋ค๋ฅธ ์ธก๋ฉด์ ์ด์ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ์๋ก์ด ๊ตฌ๋ฌธ์ ํธ์ถ ๊ฐ๋ฅํ ํจ์๋ฅผ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ์ฌ ์ฝ๋ฐฑ์์ ๋ณด๋ค ๊น๋ํ๊ฒ ๋ง์ถ ์ ์๋๋กํฉ๋๋ค. ์ค์ ๋ก, ํ์ดํ ํจ์์ ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ ์ค๊ดํธ๋ฅผ ์์ ํ ์์ ๊ณ ์คํ๋ ๋ช ๋ น๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ๋ฐํํ๋ ๋จ์ผ ํ์ ๋๋ค.
const traditional = function(data) {
return (`${data} from a traditional function`);
}
const arrow = data => `${data} from an arrow function`;
console.log(traditional("Hi")); // "Hi from a traditional function"
console.log(arrow("Hi")); // "Hi from an arrow function"
ํ์ดํ ํจ์๋ ์ฌ๋ฌ ๊ฐ์ง ํน์ฑ์ ์บก์ํํ์ฌ ๋ ํธ๋ฆฌํ๊ฒ ๋ถ๋ฅผ ์ ์์ผ๋ฉฐ, ํจ์๋ฅผ ๋ถ๋ฅผ ๋ ์ ์ฉํ์ง ์์ ๋ค๋ฅธ ํ๋์ ๋ฐฐ์ ํฉ๋๋ค. ๋ณด๋ค ๋ค์ํ ๊ธฐ์กด function
ํค์๋๋ฅผ ๋์ฒดํ๋ ๊ฒ์ ์๋๋๋ค.
์๋ฅผ ๋ค์ด, ํ์ดํ ํจ์๋ this
์ arguments
๋ฅผ ํธ์ถ ๋ ์ปจํ
์คํธ์์ ์์ํฉ๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฒญ ๋ ์ปจํ
์คํธ์ ์ ์ฉํ๊ธฐ ์ํด ํธ์ถ๋๋ ๋์์ ์์ฃผ ์ํ ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋๋ setTimeout
๊ณผ ๊ฐ์ ์ํฉ์ ์ ์ฉํฉ๋๋ค. ๊ธฐ์กด ํจ์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ .bind(this)
๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด this
์ ํจ์๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ๊ฐ์ํ์ต๋๋ค. ํ์ดํ ํจ์์๋ ํ์ํ์ง ์์ต๋๋ค.
class GreeterTraditional {
constructor() {
this.name = "Joe";
}
greet() {
setTimeout(function () {
console.log(`Hello ${this.name}`);
}, 1000); // inner function has its own this with no name
}
}
let greeterTraditional = new GreeterTraditional();
greeterTraditional.greet(); // "Hello "
class GreeterBound {
constructor() {
this.name = "Steven";
}
greet() {
setTimeout(function () {
console.log(`Hello ${this.name}`);
}.bind(this), 1000); // passing this from the outside context
}
}
let greeterBound = new GreeterBound(); // "Hello Steven"
greeterBound.greet();
class GreeterArrow {
constructor() {
this.name = "Ravi";
}
greet() {
setTimeout(() => {
console.log(`Hello ${this.name}`);
}, 1000); // arrow function inherits this by default
}
}
let greeterArrow = new GreeterArrow();
greeterArrow.greet(); // "Hello Ravi"
Understand What Youโre Getting
์ด๊ฒ์ ๋จ์ง syntactic sugar๊ฐ ์๋๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ JavaScript์ ๋ง์ ์๋ก์ด ๋ณ๊ฒฝ ์ฌํญ์ด ๋์ ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ JavaScript์ ๊ธฐ์กด ๊ตฌ๋ฌธ์ ๋ํ ์ค๋๋ ์ด์ ๊ฐ ์ฌ๋ผ์ก๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์ข ์ข ๊ธฐ์กด JavaScript ๊ตฌ๋ฌธ์ ๊ณ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ฉฐ, ๋๋ก๋ ์๋ก์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ํจ์ฌ ๋นจ๋ฆฌ ์์ฑํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
ํ๋ก์ฐํ๋ ์จ๋ผ์ธ ์์ต์๋ฅผ ํ์ธํ์ญ์์ค. ์์ฑ์๊ฐ var
๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ณ์๋ฅผ ์ด๊ธฐํํ๊ณ ํ๋กํ ํ์
์์์ ์ ํธํ๋ ํด๋์ค๋ฅผ ๋ฌด์ํ๊ฑฐ๋ ์ฝ๋ฐฑ์ function
๋ฌธ์ ์์กดํ๋ ๊ฒฝ์ฐ ๋๋จธ์ง ๊ตฌ๋ฌธ์ ๊ตฌ์ด์ ์ด๋ฉฐ, ๊ธฐ์กด์ JavaScript๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒ์ผ๋ก ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑด ๊ด์ฐฎ์ต๋๋ค. ์ค๋๋ JavaScript๊ฐ ํญ์ ๊ฐ๋ฅด์ณ์ง๊ณ ์ฌ์ฉ๋ ๊ธฐ์กด ๋ฐฉ์์ ํตํด ๋ฐฐ์ฐ๊ณ ์ ์ฉ ํ ์์๋ ๊ฒ๋ค์ด ์ฌ์ ํ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ธฐํ์์ let
๊ณผ const
, ์ฝ๋ฐฑ์ ํ์ดํ ํจ์ ๋ฐ ํด๋์ค๋ฅผ ๊ฐ์ฒด ์งํฅ ํจํด์ ๊ธฐ์ด๋ก ๋ณด๋ ๊ฒฝ์ฐ ์๋ง๋ ์์ ์์ ๋ค๋ฅธ ์ต์ JavaScript ์ฝ๋๋ ๋ณผ ์ ์์ต๋๋ค.
ํ๋ JavaScript์์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ธ์ด๊ฐ ์ค์ ๋กํ๋ ์ผ์์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ ๊ฒ์ ๋๋ค. ์ต์ํ ๊ฒ์ ๋ฐ๋ผ ํญ์ ๋ช ํํ์ง ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฑ์ค์ธ ์ฝ๋๊ฐ ๋ฌ์ฑํ๋ ค๋ ๋ชฉํ, ๋ฐฐํฌํด์ผ ํ ์์น ๋ฐ ๋ค์์ ๋๊ฐ ์์ ํด์ผํ๋์ง ์๊ฐํด๋ณด์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ์ต์ ์ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ์ค์ค๋ก ๊ฒฐ์ ํ์ญ์์ค.
๋ฒ์ญ ํ์ด์ง ์ฃผ์ : https://www.sitepoint.com/modern-javascript-best-practices/