๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

"JavaScript" ํƒœ๊ทธ๋กœ ์—ฐ๊ฒฐ๋œ 19๊ฐœ ๊ฒŒ์‹œ๋ฌผ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํƒœ๊ทธ ๋ณด๊ธฐ

ยท ์•ฝ 12๋ถ„

๋ชจ๋ฐ”์ผ ์‚ฌํŒŒ๋ฆฌ ๋””๋ฒ„๊น…#

  • ์•„์ดํฐ์„ ๋งฅ๋ถ์— ์—ฐ๊ฒฐํ•œ๋‹ค.

  • ์•„์ดํฐ์—์„œ ๋””๋ฒ„๊น…ํ•˜๊ณ ์ž ํ•˜๋Š” ์›นํŽ˜์ด์ง€๋ฅผ Safari์— ๋„์šด๋‹ค.

  • ๋งฅ๋ถ์—์„œ Safari๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  • ๊ฐœ๋ฐœ์ž์šฉ > iPhone > Safari ์›น ํŽ˜์ด์ง€ ์„ ํƒ

    2020-11-10-201110-image-0

  • ์š”์†Œ, ์ฝ˜์†”, ์†Œ์Šค, ๋„คํŠธ์›Œํฌ ๋“ฑ ์‚ฌํŒŒ๋ฆฌ์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋‹ค.

    2020-11-10-201110-image-1

Debugging Your iPhone Mobile Web App With Safari Dev Tools

๋ชจ๋ฐ”์ผ ์‚ฌํŒŒ๋ฆฌ๋ฅผ ๋งฅ์˜ Chrome์—์„œ ๋””๋ฒ„๊น…ํ•˜๊ธฐ#

๋ชจ๋ฐ”์ผ Safari๋ฅผ ๋งฅ์˜ Chrome์—์„œ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์— ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค.

Jon Sadka - How to debug an issue in Chrome for iOS using remote debugging

๋ฆฌ์•กํŠธ#

  • ๋ฆฌ์•กํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

  • ์ด๋ฅผ Virtual-DOM์œผ๋กœ ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๋Š” JavaScript ์ผ๋ฐ˜ ๊ฐ์ฒด์ด๋‹ค. (Plain Object)

  • ๊ธฐ์กด VanillaJS๋Š” UI๋ฅผ ๋ช…๋ นํ˜•์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ, React๋Š” ์„ ์–ธํ˜•์œผ๋กœ UI๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ#

  • ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ ๊ฐ’์ธ state ์™€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‚ด๋ ค ์ฃผ๋Š”์†์„ฑ ๊ฐ’ props ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋Š” state , props ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด render() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

  • UI ๋ฐ์ดํ„ฐ(์ƒํƒœ๊ฐ’๊ณผ ์†์„ฑ๊ฐ’)๋กœ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ์ด๋‹ค.

  • setState ๋Š” ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๋ฆฌ์•กํŠธ์˜ ๋ Œ๋”๋ง ๊ณผ์ •#

  • ์ปดํฌ๋„ŒํŠธ์˜ Props๋‚˜ State์˜ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ, ์ปดํฌ๋„ŒํŠธ์˜ ์ด์ „ ์ƒํƒœ ์—˜๋ฆฌ๋จผํŠธ์™€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์‹ค์ œ DOM์˜ ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๋น„๊ตํ•˜์—ฌ์ฐพ์€ ๋ณ€๊ฒฝ ์ ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐฑ์‹ ํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ์˜ setState ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ Dirty ์ฒดํฌํ•˜๊ณ , ๋‹ค์Œ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ๋ฐฐ์น˜ ์ž‘์—…์œผ๋กœ ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค. (๋น„๋™๊ธฐ )

  • ์ด๋Ÿฌํ•œ ๋ฆฌ์•กํŠธ์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ชผ๊ฐค ์ˆ˜ ์žˆ๋‹ค.

    • ๋ณ€๊ฒฝ ์ ์„ ์ฐพ๋Š” Reconciliation์˜ Diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜ (render or reconciliation phase)

    • ๋ณ€๊ฒฝ ์ ์„ ์‹ค์ œ UI์— ์ ์šฉํ•˜๋Š” ReactDOMComponent.updateComponent (commit phase)

Reconciliation: The diffing algorithm#

Reconciliation์€ ์–ด๋–ค ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ „/ํ›„ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๋น„๊ต(Diff)ํ•˜์—ฌ, ๊ฐฑ์‹ ์ดํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ์„ ์ฐพ์•„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ DOM ์กฐ์ž‘์„์ตœ์†Œํ™”์‹œํ‚จ๋‹ค.

๋‹ค์‹œ ์ •๋ฆฌ

  • render() ์—์„œ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ

  • ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ ์ ์„ ์ฐพ์•„ ์—…๋ฐ์ดํŠธ

๊ทธ๋Ÿฐ๋ฐ Diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(n^3)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์Œ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ O(n)์— ๊ทผ์‚ฌํ•œ ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

  • ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋‘ ์—˜๋ฆฌ๋จผํŠธ๋Š” ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

  • ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์—˜๋ฆฌ๋จผํŠธ์— key ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

โ˜ ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ง๊ด€์— ์˜์กดํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. ์ฆ‰ ํœด๋ฆฌ์Šคํ‹ฑ์€ ๋ณดํ†ต ํ•ฉ๋ฆฌ์ ์ธ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ฐ€์ง€์ง€๋งŒ ๊ทธ๊ฒƒ์ด ํ•ญ์ƒ ๊ทธ๋ ‡๋‹ค๋Š” ์–ด๋– ํ•œ ์ถ”๋ก  ๊ณผ์ •์ด๋‚˜ ์ฆ๋ช…์ด ์—†๋‹ค.

๊ฐ™์€ ์œ„์น˜์—์„œ ์—˜๋ฆฌ๋จผํŠธ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ

  1. ๊ธฐ์กด ํŠธ๋ฆฌ๋ฅผ ์ œ๊ฑฐ ํ›„ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.

  2. ๊ธฐ์กด ํŠธ๋ฆฌ ์ œ๊ฑฐ ์‹œ ํŠธ๋ฆฌ ๋‚ด๋ถ€(ํ•˜์œ„)์˜ ์—˜๋ฆฌ๋จผํŠธ/์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ๋‹ค. (์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ์ œ๊ฑฐ๋˜๋ฉด์„œ componentWillUnmount() ๊ฐ€ ์‹คํ–‰๋จ.) ์ด์ „ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  state๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

  3. ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‚ด๋ถ€ ์—˜๋ฆฌ๋จผํŠธ/์ปดํฌ๋„ŒํŠธ๋“ค๋„ ๋ชจ๋‘ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค. (์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ componentDidMount() ๊ฐ€ ์‹คํ–‰๋จ.)

๊ฐ™์€ ์œ„์น˜์—์„œ ์—˜๋ฆฌ๋จผํŠธ์˜ ํƒ€์ž…์ด ๊ฐ™์€ ๊ฒฝ์šฐ

  1. ์—˜๋ฆฌ๋จผํŠธ์˜ attributes ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

  2. ๋ณ€๊ฒฝ๋œ attributes ๋งŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  3. ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋“ค์— diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•œ๋‹ค.

๊ฐ™์€ ์œ„์น˜์—์„œ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ๊ทธ ํƒ€์ž…์ด ๊ฐ™์€ ๊ฒฝ์šฐ

  1. ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค ์ž์ฒด๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. (state๊ฐ€ ์œ ์ง€๋œ๋‹ค.)

  2. ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์˜ ์—…๋ฐ์ดํŠธ ์ „ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ๋“ค์ด ํ˜ธ์ถœ๋˜๋ฉฐ props๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

  3. render() ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ์˜ ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ์™€ ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ์—๋Œ€ํ•ด diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•œ๋‹ค.

์ž์‹ ์—˜๋ฆฌ๋จผํŠธ ์žฌ๊ท€

  • ๋ฆฌ์•กํŠธ๋Š” ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์ ์ธ ๋น„๊ต๋ฅผ ํ•  ๋•Œ ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๊ณ  ์ฐจ์ด์ ์ด ์žˆ์œผ๋ฉด ๋ณ€๊ฒฝ์„ ์ƒ์„ฑํ•œ๋‹ค.

  • ์ •๋ ฌ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์— ์ทจ์•ฝํ•˜๋‹ค.

keys

  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋“ค์ด key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด key๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ํŠธ๋ฆฌ์™€ ์ดํ›„ ํŠธ๋ฆฌ์˜ ์ž์‹ ๋“ค์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

Avoid Reconciliation#

  • ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

    • ShouldComponentUpdate ํ•จ์ˆ˜๊ฐ€ return false ํ•˜๋„๋ก ํ•œ๋‹ค.

    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ PureComponent ๋ฅผ ์ƒ์†๋ฐ›๋„๋ก ํ•œ๋‹ค.

    • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ React.memo() ๋กœ ๊ฐ์‹ธ์„œ export ํ•œ๋‹ค.

โ˜ ํ•ต์‹ฌ์€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ state , props ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ Œ๋”๋งํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ๋ฆฌ์•กํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ง•ํ•˜๋Š”๊ฒƒ์ด๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ์ผ€์ด์Šค๋Š” ๊ฐ™์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ๊ฐ™์€ props ๋กœ ์ž์ฃผ ๋ Œ๋”๋ง ๋ ๋•Œ์ด๋‹ค. ์ด์ „ ๋ฉ”๋ชจ์ด์ง• ๊ฒฐ๊ณผ์™€ props ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋‚ด๋ถ€๋ฅผ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ์ด์ง•๋œ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ props ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋ผ๋ฉด, ์ด์ „ props ์™€ ๋‹ค์Œ props ๋น„๊ต๋ฅผ ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ props ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋˜ํ•œ ๋ฉ”๋ชจ์ด์ง•์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚จ์šฉํ•ด์„  ์•ˆ๋œ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ์„ฑ๋Šฅ์— ์ตœ์ ํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋น„ํšจ์œจ์ ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์ ˆํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์ ˆํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ด์Šˆ๋ฅผ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ „๋žต์ด๋‹ค.

UI ๋Ÿฐํƒ€์ž„์œผ๋กœ์„œ์˜ React

์žฌ์กฐ์ • (Reconciliation) - React

์„ฑ๋Šฅ ์ตœ์ ํ™” - React

React ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅ ์•Œ์•„๋ณด๊ธฐ : TOAST Meetup

React.memo() ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฆฌ์•กํŠธ ํ›…(Hook)#

ํ›…(Hook)์ด๋ž€?#

  • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ React state๋ฅผ ์—ฐ๋™(hook into)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜.

  • ์ฆ‰ ์ƒํƒœ๋ฅผ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ๋™๊ธฐํ™” ํ•ด์ค€๋‹ค. (์ด ๋ง์€ ์ƒํƒœ๊ฐ€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‚ดํฌํ•จ.)

๋™๊ธฐ#

  • ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

    • render props, HOC์™€ ๊ฐ™์€ ํŒจํ„ด์€ ๋ž˜ํผ๋ฅผ ๊นŠ๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ๋“ค์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.

  • ํด๋ž˜์Šค๋ณด๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ง๊ด€์ ์ด๋‹ค. this ๋ฐ”์ธ๋”ฉ


ํ›…์˜ ๊ทœ์น™#

โ˜ ๋ฆฌ์•กํŠธ๋Š” ํ›…์ด ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ์— ์˜์กดํ•œ๋‹ค. (์ƒํƒœ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ ์ˆœ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.)

  • ์ตœ์ƒ์œ„(at the Top Level)์—์„œ๋งŒ ํ›…์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. (๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•˜์ง€ ๋ง๋ผ)

    // ๐Ÿ”ด ์กฐ๊ฑด๋ฌธ์— Hook์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฒซ ๋ฒˆ์งธ ๊ทœ์น™์„ ๊นผ์Šต๋‹ˆ๋‹คif (name !== '') {    useEffect(function persistForm() {        localStorage.setItem('formData', name);    });}
  • ์˜ค์ง React ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. (์ผ๋ฐ˜ JS ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•˜์ง€ ๋ง๋ผ)

โ˜ ๋ฆฌ์•กํŠธ์˜ ํ›…์€ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ํ•œ ์ˆ˜์ค€ ์œ„์˜ ์™ธ๋ถ€ ๊ณต๊ฐ„(์‹คํ–‰ ์ปจํ…์ŠคํŠธ)์— ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(๋ฐฐ์—ด)ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ( state , setter )์ด๋‹ค. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ๋˜์ง€ ์•Š๊ณ , ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์—‘์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.

useState#

useState์—์„œ ๋ฐ˜ํ™˜๋œ setter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, React์—๊ฒŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์•ก์…˜์„ dispatch ํ•˜๊ฒŒ ๋˜๊ณ , ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ new state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆฐ๋‹ค.

React hooks: not magic, just arrays

useEffect#

  • ๋ Œ๋”๋ง ์ดํ›„(DOM ์—…๋ฐ์ดํŠธ ํ›„)์— ์ˆ˜ํ–‰ํ•  "side effect"๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Fiber#

  • virtualDOM์˜ ์ฆ๋ถ„ ๋ Œ๋”๋ง์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•จ.

  • requestIdleCallback ์„ ํ™œ์šฉ.

  • ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด๋ถ€ ๊ฐ์ฒด

  • ๋‚ด์žฅ ์Šคํƒ์— ์˜์กดํ•œ ๋™๊ธฐ์‹ ์žฌ๊ท€ ๋ชจ๋ธ์—์„œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š” ๋น„๋™๊ธฐ์‹๋ชจ๋ธ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ๊ตฌํ˜„ํ•จ.

    • ํ˜ธ์ถœ ์Šคํƒ์„ ๋งˆ์Œ๋Œ€๋กœ ์ค‘๋‹จํ•˜๊ณ  ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ˆ˜๋™์œผ๋กœ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด

React Fiber Architecture - A Deep Dive

ยท ์•ฝ 8๋ถ„

์›นํŒฉ#

  • ์›นํŒฉ์€ static module bundler์ด๋‹ค.

  • ์›นํŒฉ์€ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šคํ•˜์—ฌ, ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ dependency graph๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•œ๋‹ค .

    • Entry : dependency graph๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ง„์ž…์ 

    • Output : ๋ฒˆ๋“ค๋œ ๊ฒฐ๊ณผ ํŒŒ์ผ

    • Loader : ๊ธฐ๋ณธ์ ์œผ๋กœ js, json ํŒŒ์ผ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, loader๋Š” ์›นํŒฉ์ด ๋‹ค๋ฅธ์œ ํ˜•์˜ ํŒŒ์ผ๋„ ๋ชจ๋“ˆ๋กœ์„œ ๊ฐ€์ ธ์˜ค๊ณ  dependency graph๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ex) jpg ์ด๋ฏธ์ง€, ํฐํŠธ, ...

    • Plugin : ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”, ์ž์› ๊ด€๋ฆฌ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ์ฃผ์ž… ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชฉ์ ์˜ ํ™˜๊ฒฝ ์„ค์ •์„ ์œ„ํ•ด ์‚ฌ์šฉ.

    • Mode : production | development ๋“ฑ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์›นํŒฉ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

HTTP#

HTTP ๋ฒ„์ „๋ณ„ ์ฐจ์ด์ #

HTTP์˜ ์ง„ํ™”

HTTP/0.9#

  • ์ดˆ๊ธฐ ๋ฒ„์ „

  • GET ์ด ์œ ์ผํ•œ ๋ฉ”์„œ๋“œ

  • HTTP ํ—ค๋”๊ฐ€ ์—†์—ˆ๊ณ  HTML ํŒŒ์ผ๋งŒ ์ „์†ก๋  ์ˆ˜ ์žˆ์—ˆ์Œ.

  • ์ƒํƒœ๋‚˜ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋„ ์—†์—ˆ๋‹ค.

HTTP/1.0#

  • ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ์š”์ฒญ์œผ๋กœ ์ „์†ก๋˜๊ธฐ ์‹œ์ž‘ ex) GET /mypage.html HTTP/1.0

  • ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ์‘๋‹ต์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋ถ™์–ด ์ „์†ก๋จ.

  • HTTP ํ—ค๋” ๊ฐœ๋…์ด ๋„์ž…๋จ.

    • HTML ํŒŒ์ผ ์™ธ์— ๋‹ค๋ฅธ ๋ฌธ์„œ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

HTTP/1.1#

  • HTTP์˜ ์ฒซ ๋ฒˆ์งธ ํ‘œ์ค€ ๋ฒ„์ „

  • ์ปค๋„ฅ์…˜์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

    • ์›๋ณธ ๋ฌธ์„œ ๋‚ด์— ์ž„๋ฒ ๋“œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์œ„ํ•ด์„œ, ๊ธฐ์กด์— ์—ฐ๊ฒฐ๋œ ์ปค๋„ฅ์…˜์„ ๋‹ค์‹œ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์Œ.
  • ํŒŒ์ดํ”„๋ผ์ด๋‹์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์™„์ „ํžˆ ์ „์†ก๋˜๊ธฐ ์ „์— ๋‘ ๋ฒˆ์งธ ์š”์ฒญ์ „์†ก์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ๋‹ค.

2020-11-08-201108-image-0

HTTP/2#

  • ์ด์ง„ ํ”„๋กœํ† ์ฝœ (1.1์€ ํ…์ŠคํŠธ ํ”„๋กœํ† ์ฝœ)

  • Multiplexing

2020-11-08-201108-image-1

2020-11-08-201108-image-2

โ˜ multiplexing vs pipelining

  • pipelining์€ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค โ†’ Head Of Line blocking ๋ฌธ์ œ

  • multiplexing์€ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค.

2020-11-08-201108-image-3

HTTP 1.1 vs HTTP.2 vs HTTP/2 with Push - Manning

HTTP ์ƒํƒœ ์ฝ”๋“œ#

1xx : ์ •๋ณด ์‘๋‹ต#

2xx : ์„ฑ๊ณต ์‘๋‹ต#

  • 200 : OK. ์š”์ฒญ ์„ฑ๊ณต

  • 201 : Created. ์ƒ์„ฑ ์š”์ฒญ ์„ฑ๊ณต

  • 202 : Accepted. ์š”์ฒญ ์ˆ˜๋ฝ

  • 204 : ์„ฑ๊ณตํ–ˆ์œผ๋‚˜ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด ์—†์Œ

3xx : ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋ฉ”์‹œ์ง€#

  • 300 : Multiple choices. ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ ๊ฒฐ๊ณผ ๋ชฉ๋ก

  • 301 , 302 , 303 : Redirect. ๋ฆฌ์†Œ์Šค ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ

  • 304 : Not modified. ๋ฆฌ์†Œ์Šค๊ฐ€ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Œ

4xx : ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ ์‘๋‹ต#

  • 400 : Bad Request. ์š”์ฒญ ์˜ค๋ฅ˜

  • 401 : Unauthorized. ๊ถŒํ•œ ์—†์Œ

  • 403 : Forbidden. ์š”์ฒญ ๊ฑฐ๋ถ€

  • 404 : Not Fount. ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†๋Š” ์ƒํƒœ

5xx : ์„œ๋ฒ„ ์—๋Ÿฌ ์‘๋‹ต#

  • 500 : ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ๋ชปํ•จ

  • 501 : Not Implemented. ์„œ๋ฒ„๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ

  • 503 : Service Unavailable. ๊ณผ๋ถ€ํ•˜ ๋“ฑ์œผ๋กœ ๋‹น์žฅ ์„œ๋น„์Šค๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ

๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •#

2020-11-08-201108-image-4

2020-11-08-201108-image-5

  • DOM ๋ฐ CSSOM ํŠธ๋ฆฌ๋Š” ๊ฒฐํ•ฉ๋˜์–ด ๋ Œ๋”๋ง ํŠธ๋ฆฌ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋ Œ๋”๋ง ํŠธ๋ฆฌ์—๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋…ธ๋“œ๋งŒ( ๋ฉ”ํƒ€ ํƒœ๊ทธ, ์Šคํฌ๋ฆฝํŠธํƒœ๊ทธ, display: none ๋“ฑ์ด ์ œ์™ธ๋จ. )ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    โ˜ visibility: hidden , display: none ์€ ๋‹ค๋ฅด๋‹ค.

  • ๋ ˆ์ด์•„์›ƒ์€ ๊ฐ ๊ฐ์ฒด์˜ ์ •ํ™•ํ•œ ์œ„์น˜ ๋ฐ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. (๊ฒฝ์šฐ์— ๋”ฐ๋ผ "๋ฆฌํ”Œ๋กœ์šฐ" ๋ผ๊ณ ๋„ ํ•œ๋‹ค.)

  • ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” ์ตœ์ข… ๋ Œ๋”๋ง ํŠธ๋ฆฌ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ํŽ˜์ธํŠธ์ด๋ฉฐ, ํ”ฝ์…€์„ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. (๊ฒฝ์šฐ์— ๋”ฐ๋ผ "๋ฆฌํŽ˜์ธํŠธ"๋ผ๊ณ ๋„ ํ•œ๋‹ค.)


๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์ตœ์ ํ™”#

์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๊ธฐ๋Š” ์ดˆ๋‹น 60ํšŒ(60fps)์˜ ๋นˆ๋„๋กœ ํ™”๋ฉด์„ ์ƒˆ๋กœ ๊ณ ์นœ๋‹ค. ๋”ฐ๋ผ์„œ๊ฐ ํ”„๋ ˆ์ž„์—๋Š” 16ms ๊ฐ€๋Ÿ‰์˜ ์‹œ๊ฐ„๋งŒ ํ• ๋‹น๋œ๋‹ค. (1์ดˆ / 60 = 16.66ms) ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰ ์ค€๋น„๋ฅผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 10ms ๋‚ด์— ๋ชจ๋“  ์ž‘์—…์„ ์™„๋ฃŒํ•ด์•ผ ํ•œ๋‹ค.

ํ”ฝ์…€ ํŒŒ์ดํ”„๋ผ์ธ#

2020-11-08-201108-image-6

2020-11-08-201108-image-7

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์‹œ๊ฐ์  ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ์ž‘์—…. CSS Animation, Transitions, Web Animation API ์—ญ์‹œ ํฌํ•จ.

  • ์Šคํƒ€์ผ ๊ณ„์‚ฐ : ์–ด๋–ค ์Šคํƒ€์ผ ๊ทœ์น™(CSS)์„ ์–ด๋–ค ์š”์†Œ์— ์ ์šฉํ• ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค

  • ๋ ˆ์ด์•„์›ƒ : ํ™”๋ฉด์—์„œ ์–ผ๋งˆ์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์–ด๋””์— ๋ฐฐ์น˜๋˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  • ํ•ฉ์„ฑ : ํŽ˜์ด์ง€์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์ด ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๋กœ ๊ทธ๋ ค์กŒ๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€๊ฐ€ ์ •ํ™•ํžˆ๋ Œ๋”๋ง ๋˜๋ ค๋ฉด ์ •ํ™•ํ•œ ์ˆœ์„œ๋กœ ํ™”๋ฉด์— ๊ทธ๋ ค์•ผ ํ•œ๋‹ค.

โ˜ ์ฝ”๋“œ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์–ด๋–ค ๋ถ€๋ถ„์„ ํŠธ๋ฆฌ๊ฑฐ ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”

1. JS / CSS > ์Šคํƒ€์ผ > ๋ ˆ์ด์•„์›ƒ > ํŽ˜์ธํŠธ > ํ•ฉ์„ฑ#

2020-11-08-201108-image-8

๋ ˆ์ด์•„์›ƒ ๋„ˆ๋น„, ๋†’์ด, ์™ผ์ชฝ ๋˜๋Š” ์ƒ๋‹จ ์œ„์น˜ ๋“ฑ ์š”์†Œ์˜ ๊ธฐํ•˜ํ•™์  ํ˜•ํƒœ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” "layout" ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ™•์ธํ•˜๊ณ  ํŽ˜์ด์ง€์— ๋Œ€ํ•ด "๋ฆฌํ”Œ๋กœ์šฐ"๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์˜ํ–ฅ์„ ๋ฐ›์€ ์˜์—ญ์ด ์žˆ์œผ๋ฉด ๋‹ค์‹œ ํŽ˜์ธํŠธํ•˜๊ณ , ๋‹ค์‹œํ•ฉ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

2. JS / CSS > ์Šคํƒ€์ผ > ํŽ˜์ธํŠธ > ํ•ฉ์„ฑ#

2020-11-08-201108-image-9

ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€, ํ…์ŠคํŠธ ์ƒ‰์ƒ, ๊ทธ๋ฆผ์ž ๋“ฑ์˜ "paint only" ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ ˆ์ด์•„์›ƒ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ํŽ˜์ธํŠธ ์ž‘์—…, ํ•ฉ์„ฑ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

3. JS / CSS > ์Šคํƒ€์ผ > ํ•ฉ์„ฑ#

2020-11-08-201108-image-10

๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŠธ๊ฐ€ ํ•„์š” ์—†๋Š” ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ฉ์„ฑ ๋‹จ๊ณ„๋กœ ๊ฑด๋„ˆ ๋›ด๋‹ค. ๊ฐ€์žฅ ์ด์ƒ์ ์ด๊ณ  ๋น„์šฉ์ด ๊ฐ€์žฅ ์ ๊ฒŒ ๋“œ๋Š” ๋ฒ„์ „์ด๋‹ค. ( ํ˜„์žฌ ๋ถ€ํ•ฉ๋˜๋Š” ์†์„ฑ์€ transform , opacity 2๊ฐ€์ง€ ๋ฟ์ด๋‹ค. )

โ˜ CSS ์†์„ฑ์ด ์–ด๋–ค ๋ฒ„์ „์„ ํŠธ๋ฆฌ๊ฑฐํ•  ์ง€ ์•Œ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ CSS ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ฐธ์กฐ. ๋˜๋Š” ์ด ๋งํฌ ์ฐธ์กฐ

์ฐธ๊ณ ์ž๋ฃŒ#

Rendering Performance | Web Fundamentals | Google Developers


์ด๋ฏธ์ง€ ๋ ˆ์ด์ง€๋กœ๋“œ#

Lazy-loading images

The Complete Guide to Lazy Loading Images | CSS-Tricks


ยท ์•ฝ 11๋ถ„

์„ฑ๋Šฅ ์ธก์ •#

๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€#

DOMContentLoadedย ์ด๋ฒคํŠธ#

  • HTML๊ณผ CSS ํŒŒ์‹ฑ์ด ๋๋‚˜๋Š” ์‹œ์ 

  • ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ค€๋น„๊ฐ€ ๋œ(DOM ๋ฐ CSSOM ๊ตฌ์„ฑ์ด ๋๋‚œ) ์ƒํ™ฉ

loadย ์ด๋ฒคํŠธ#

  • HTML ์ƒ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ๋กœ๋“œ๋œ ์‹œ์ 

๊ทธ๋ฆฌ๊ณ  ์ด ๋‘ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ์€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ API๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ธฐ์ค€#

2020-11-08-201109-image-0

FP(First Paint)#

  • ํฐ ํ™”๋ฉด์—์„œ ํ™”๋ฉด์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๊ทธ๋ ค์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ˆœ๊ฐ„์ด๋‹ค.

FCP(First Contentful Paint)#

  • ํ…์ŠคํŠธ๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ˆœ๊ฐ„์ด๋‹ค.

FMP(First Meaningful Paint)#

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

TTI(Time to Interactive)#

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ดˆ๊ธฐ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์–ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ–‰๋™์„ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์ˆœ๊ฐ„์ด๋‹ค.

์„ฑ๋Šฅ ์ตœ์ ํ™”

๋กœ๋”ฉ ์ตœ์ ํ™”#

๋ธ”๋ก ๋ฆฌ์†Œ์Šค(๋˜๋Š” ๋ Œ๋”๋ง ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค) ์ตœ์ ํ™”#

๋ธŒ๋ผ์šฐ์ € ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ํŒŒ์‹ฑ ์ค‘ ๋ธ”๋ก ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ธ”๋ก ๋ฆฌ์†Œ์Šค์—๋Š” CSS ์™€ JavaScript๊ฐ€ ํฌํ•จ๋œ๋‹ค.

CSS ์ตœ์ ํ™”#

  • DOM ํŠธ๋ฆฌ๋Š” ํŒŒ์‹ฑํ•˜๋ฉด์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • CSSOM ํŠธ๋ฆฌ๋Š” CSS๋ฅผ ๋ชจ๋‘ ํ•ด์„ํ•ด์•ผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฆ‰ CSSOM ํŠธ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๊ณ , ๋ Œ๋”๋ง์ด ์ฐจ๋‹จ๋˜์–ด์žˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ CSS๋Š” ํ•ญ์ƒ HTML ๋ฌธ์„œ ์ตœ์ƒ๋‹จ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋˜ํ•œ ํŠน์ • ์กฐ๊ฑด(์„ธ๋กœ ๋ชจ๋“œ, ์ธ์‡„ ๋ชจ๋“œ ๋“ฑ)์—์„œ๋งŒ ํ•„์š”ํ•œ CSS๋Š”, ํ•ด๋‹น ๊ฒฝ์šฐ์—๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”ํ•œ๋‹ค.

    ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (์ตœ์ ํ™” ์ „)

    <link href="style.css" rel="stylesheet" /><link href="print.css" rel="stylesheet" /><link href="portrait.css" rel="stylesheet" />

    ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ (์ตœ์ ํ™” ํ›„)

    <link href="style.css" rel="stylesheet" /><link href="print.css" rel="stylesheet" media="print" /><link href="portrait.css" rel="stylesheet" media="orientation:portrait" />
  • ์™ธ๋ถ€ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” @import ๋ฌธ์€ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.

JavaScript ์ตœ์ ํ™”#

  • JavaScript๋Š” DOMํŠธ๋ฆฌ์™€ CSSOM ํŠธ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— HTML ํŒŒ์‹ฑ์„์ฐจ๋‹จํ•˜๋Š” ๋ธ”๋ก ๋ฆฌ์†Œ์Šค์ด๋‹ค.

  • <script> ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ ๊ทธ ์ด์ „๊นŒ์ง€ ์ƒ์„ฑ๋œ DOM์—๋งŒ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ DOM ํŠธ๋ฆฌ ์ƒ์„ฑ์ด ์ค‘๋‹จ๋œ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ JavaScript๋ฅผ ๋ Œ๋”๋ง ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค๋ผ๊ณ  ํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค ์š”์ฒญ ์ˆ˜ ์ค„์ด๊ธฐ#

์ด๋ฏธ์ง€ ์Šคํ”„๋ผ์ดํŠธ#

2020-11-08-201109-image-1

  • ์›น ํŽ˜์ด์ง€์—์„œ ์•„์ด์ฝ˜ ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ์•„์ด์ฝ˜ ๋งˆ๋‹ค๋ฐœ์ƒ

  • ์—ฌ๋Ÿฌ ์•„์ด์ฝ˜์„ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค๊ณ , CSS์˜ background-position ์†์„ฑ์„์‚ฌ์šฉํ•ด ๋ถ€๋ถ„ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฆฌ์†Œ์Šค ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

CSS, JavaScript ๋ฒˆ๋“ค๋ง#

  • ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ์ด์ „์—๋Š” ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด์„œ ๊ฐ€์ ธ์™”์—ˆ๋‹ค.

  • Webpack, Rollup ๋“ฑ์˜ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ 1๊ฐœํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ๋ฆฌ์†Œ์Šค ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๋ถ€ ์Šคํƒ€์ผ ์‹œํŠธ ?#

โ˜ ๋‚ด๋ถ€ ์Šคํƒ€์ผ ์‹œํŠธ๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ๋ฆฌ์†Œ์Šค ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์„œ HTML์— CSS๊ฐ€ ๋งค๋ฒˆ ํฌํ•จ๋œ๋‹ค.

์ž‘์€ ์ด๋ฏธ์ง€๋ฅผ HTML, CSS๋กœ ๋Œ€์ฒด#

  • ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ ๊ฒฝ์šฐ, ์ด๋ฏธ์ง€๋ฅผ Base64๋กœ ๋ณ€ํ™˜ํ•œ URI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML, CSS์— ํฌํ•จํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    <img    src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAOCAYAAAAbvf3sAAAAAXNSR0IArs4c6QAAAHBJREFUKBVjYBimICwsLAaEsXmPGV0QqnAeUNxfW1v7/tWrVy8hq0HRgKQ4CahoIxDPQ9cE14CseNWqVUtAJoMUo2tiBFkXGRmp9/fv3zNAZhJIMUgMBmAGMTMzmyxfvhzhPJAmmCJ0Gp8cutqhwAcASWgwk+79LiQAAAAASUVORK5CYII="/>

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ#

import _ from 'lodash';
_.array(...);_.object(...);

โ‡’

import array from 'lodash/array';import object from 'lodash/fp/object';
array(...);object(...);

HTML ๋งˆํฌ์—… ์ตœ์ ํ™”#

  • ์ค‘์ฒฉ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌ์„ฑํ•œ๋‹ค.

Avoid an excessive DOM size

์••์ถ•(Minify)ํ•˜์—ฌ ์‚ฌ์šฉ#

  • ์›นํŒฉ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ฐ™์€ ๋„๊ตฌ์˜ ๋„์›€์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์ฃผ์„์ด๋‚˜ ๊ณต๋ฐฑ์„ ๋ชจ๋‘ ์‚ญ์ œํ•˜๊ณ , ๋‚œ๋…ํ™” ํ•˜๋Š” ๋“ฑ ์ฝ”๋“œ์˜ ์šฉ๋Ÿ‰์„ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ Œ๋”๋ง ์ตœ์ ํ™”#

requestAnimationFrame#

  • ์‹œ๊ฐ์  ๋ณ€ํ™”๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ •ํ™•ํ•œ ์‹œ๊ฐ„(ํ”„๋ ˆ์ž„ ์‹œ์ž‘ ์‹œ)์— ์ˆ˜ํ–‰๋˜๊ธธ ์›ํ•œ๋‹ค.

  • ์ด๋ฅผ ๋ณด์žฅํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ requestAnimationFrame ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • setTimeout ๋˜๋Š” setInterval ์€ ์ฝœ๋ฐฑ์ด ์ •ํ™•ํ•œ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€์•Š๋Š”๋‹ค.

2020-11-08-201109-image-2

โ˜ setTimeout ๊ณผ setInterval ์˜ ์ฝœ๋ฐฑ์€ (macro)Task queue ๋ฅผ ์‚ฌ์šฉ. requestAnimationFrame ์€ AnimationFrame ์‚ฌ์šฉ.

์Šคํƒ€์ผ ๊ณ„์‚ฐ์˜ ๋ฒ”์œ„์™€ ๋ณต์žก์„ฑ ์ค„์ด๊ธฐ#

2020-11-08-201109-image-3

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

  • ์Šคํƒ€์ผ ๊ณ„์‚ฐ ๋‹จ๊ณ„์˜ ์ฒซ ๋ถ€๋ถ„์€ ๋งค์นญ ์„ ํƒ๊ธฐ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (์š”์†Œ, ํด๋ž˜์Šค , ID, pseudo ์„ ํƒ์ž ๋“ฑ๋“ฑ)

  • ์Šคํƒ€์ผ ๊ณ„์‚ฐ์˜ ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๋งค์นญ๋œ ์„ ํƒ๊ธฐ์—์„œ ์Šคํƒ€์ผ ๊ทœ์น™์„ ๊ฐ€์ ธ์™€์„œ ์š”์†Œ์˜๋งˆ์ง€๋ง‰ ์Šคํƒ€์ผ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด ํฌํ•จ๋œ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์„ ํƒ๊ธฐ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  (BEM ๋“ฑ์˜ ๋ฐฉ๋ฒ•๋ก  ์ ์šฉ) ์Šคํƒ€์ผ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š”์š”์†Œ์˜ ์ˆ˜๋ฅผ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.

ํฌ๊ณ  ๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ ๋ฐ ์Šค๋ž˜์‹ฑ ํ”ผํ•˜๊ธฐ#

  • ๋ ˆ์ด์•„์›ƒ์˜ ๋ฒ”์œ„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ „์ฒด ๋ฌธ์„œ๋กœ ์ง€์ •๋œ๋‹ค.

    • ๋„ˆ๋น„, ๋†’์ด, ์™ผ์ชฝ ๋˜๋Š” ์ƒ๋‹จ ๋“ฑ "๊ธฐํ•˜ํ•™์  ์†์„ฑ"์˜ ๋ณ€๊ฒฝ์€ ๋ชจ๋‘ ๋ ˆ์ด์•„์›ƒ์ดํ•„์š”ํ•˜๋‹ค.

    • flexbox ๋ฅผ ์‚ฌ์šฉํ•œ ๋ ˆ์ด์•„์›ƒ์ด float ๋ฅผ ์‚ฌ์šฉํ•œ ๋ ˆ์ด์•„์›ƒ ๋ณด๋‹ค ๋น„์šฉ์ด ์ ๋‹ค.

  • DOM ์š”์†Œ์˜ ์ˆ˜๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ๊ฐ€๊ธ‰์  ๋ ˆ์ด์•„์›ƒ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

  • ๊ฐ•์ œ ๋™๊ธฐ์‹ ๋ ˆ์ด์•„์›ƒ ๋ฐ ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

    โ˜ ์›๋ž˜ ๋ ˆ์ด์•„์›ƒ์€ ๋น„๋™๊ธฐ์ด๋‚˜, ํŠน์ • ์ƒํ™ฉ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฐ•์ œ ๋™๊ธฐ์‹ ๋ ˆ์ด์•„์›ƒ ์ด๋ผ ํ•œ๋‹ค.

    function logBoxHeight() {    box.classList.add('super-big');
        // Gets the height of the box in pixels    // and logs it out.    console.log(box.offsetHeight);}
    • ์œ„์˜ ํ•จ์ˆ˜๋Š” ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•œ ํ›„์—, ๋†’์ด๋ฅผ ์š”์ฒญํ•œ๋‹ค.

    • ๋†’์ด๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ ์—ญ์‹œ ๋ ˆ์ด์•„์›ƒ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    • ์Šคํƒ€์ผ ๊ณ„์‚ฐ๊ณผ ๋ ˆ์ด์•„์›ƒ์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋ฉด ์ž ์žฌ์  ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

    function resizeAllParagraphsToMatchBlockWidth() {    // Puts the browser into a read-write-read-write cycle.    for (var i = 0; i < paragraphs.length; i++) {        paragraphs[i].style.width = box.offsetWidth + 'px';    }}
    • ์œ„์˜ ํ•จ์ˆ˜๋Š” ๊ฐ ๋ฃจํ”„์˜ ๋ฐ˜๋ณต์ด ์Šคํƒ€์ผ ๊ฐ’ box.offsetWidth ๋ฅผ ์ฝ์€ ๋‹ค์Œ, ์ฆ‰์‹œ paragraphs[i].style.width ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

    • ์ด์ „ ๋ฐ˜๋ณต์—์„œ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— box.offsetWidth ์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์—ญ์‹œ ๊ฐ•์ œ ๋™๊ธฐ์‹ ๋ ˆ์ด์•„์›ƒ์„ ์œ ๋ฐœํ•œ๋‹ค. ์ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // Read.var width = box.offsetWidth;
    function resizeAllParagraphsToMatchBlockWidth() {    for (var i = 0; i < paragraphs.length; i++) {        // Now write.        paragraphs[i].style.width = width + 'px';    }}

ํŽ˜์ธํŠธ ๋ณต์žก์„ฑ ๋‹จ์ˆœํ™” ๋ฐ ํŽ˜์ธํŠธ ์˜์—ญ ์ค„์ด๊ธฐ#

  • transform ๋˜๋Š” opacity ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์†์„ฑ ๋ณ€๊ฒฝ์€ ํ•ญ์ƒ ํŽ˜์ธํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•œ๋‹ค.

  • ๊ฐ€๋Šฅํ•œ ํ•˜์œ„ ๋…ธ๋“œ์˜ DOM์„ ์กฐ์ž‘ํ•˜๊ณ  ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝ

    • DOM์ด ์ž‘๊ณ  ๊นŠ์ด๊ฐ€ ์–•์„์ˆ˜๋ก ๊ณ„์‚ฐ์ด ๋น ๋ฅด๋‹ค.

    • ๋ถˆํ•„์š”ํ•œ ๋ž˜ํผ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

  • ์˜ํ–ฅ ๋ฐ›๋Š” ์—˜๋ฆฌ๋จผํŠธ ์ œํ•œ



ยท ์•ฝ 6๋ถ„

Strict Mode#

  • ES5 ๋ถ€ํ„ฐ ์ง€์›

  • ์ „์—ญ ๋˜๋Š” ํ•จ์ˆ˜ body์˜ ์„ ๋‘์— use strict ์ถ”๊ฐ€

  • ์•”๋ฌต์  ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐฉ์ง€

  • ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์‚ญ์ œ ๋ฐฉ์ง€

    function foo(a) {    'use strict';
        delete a;    // SyntaxError: Delete of an unqualified identifier in strict mode.}
  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ค‘๋ณต ๋ฐฉ์ง€

  • with ๋ฌธ์˜ ์‚ฌ์šฉ

  • ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ this ์— undefined ๋ฐ”์ธ๋”ฉ

    'use strict';
    function foo() {    console.log(this);}
    foo(); // undefined
    function foo() {    console.log(this);}
    foo(); // Window

DOCTYPE#

Document Type์˜ ์•ฝ์ž๋กœ ๋ฌธ์„œ๊ฐ€ ์–ด๋–ค ๋ฒ„์ „์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‚ด์šฉ์„ ์˜ฌ๋ฐ”๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

โ˜ DOCTYPE ์€ ๋ ˆ๊ฑฐ์‹œํ•œ ์ด์œ ๋กœ ํ•„์š”ํ•˜๋‹ค. ์ƒ๋žตํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌธ์„œ๋ฅผ quirks mode(ํ˜ธํ™˜ ๋ชจ๋“œ) ๋กœ ๋ Œ๋”๋งํ•˜๊ณ , ํฌํ•จํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌธ์„œ๋ฅผ no-quirks-mode(๋˜๋Š” standard mode) ๋กœ ๋ Œ๋”๋ง ํ•œ๋‹ค.

quirks mode vs standard mode#

quirks mode#

  • ์˜ค๋ž˜๋œ ๋ฌธ์„œ๊ฐ€ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ "๋น„ํ‘œ์ค€ ๋ชจ๋“œ"(๊ณผ๊ฑฐ Navigator 4 or IE 5)๋ฅผ ์ ์šฉํ•ด์„œ ๋™์ž‘ํ•œ๋‹ค.

  • ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊นจ์ง€์ง€ ์•Š๊ณ  ๋ณด์—ฌ์ง€๊ฒŒ ๋˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ์ง€๊ฒŒ๋œ๋‹ค.

standard mode#

  • ํ‘œ์ค€ HTML, CSS๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ Œ๋”๋งํ•œ๋‹ค.

DTD (Document Type Definition)#

๋ฌธ์„œ ํ˜•์‹์„ ์ •์˜ํ•œ ๊ฒƒ์œผ๋กœ DOCTYPE ์„ ๋ช…์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. DTD ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค. ๋ชจ๋“  ํƒ€์ž…์˜ ํŠน์„ฑ์„ ๋‹ค ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ณ , ํ˜„์žฌ ์‹œ์ ์—์„œ HTML5 ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด <!DOCTYPE html> ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด๋‹ค.

  • XHTML 1.1

  • XHTML 1.0

    • Strict DTD

    • Transitional DTD

    • Frameset DTD

  • HTML 4.01

    • Strict DTD

    • Transitional DTD

    • Frameset DTD

  • HTML 5

ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•#

๋ฐ”๋ฒจ#

  • ๋ฐ”๋ฒจ์€ ํ˜„์žฌ ๋ฐ ์ด์ „ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ES6 ์ด์ƒ์˜ ์ฝ”๋“œ๋ฅผ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” JavaScript ๋ฒ„์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ ๋ชจ์Œ(toolchain)์ด๋‹ค.

  • ๋ฐ”๋ฒจ์€ ์„ธ ๋‹จ๊ณ„๋กœ ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

    1. ํŒŒ์‹ฑ (Parsing) : ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์ถ”์ƒ ๊ตฌ๋ฌธํŠธ๋ฆฌ(AST)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋‹จ๊ณ„

    2. ๋ณ€ํ™˜ (Transforming) : ๋ฐ”๋ฒจ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‹จ๊ณ„

    3. ์ถœ๋ ฅ (Printing) : ๋ณ€๊ฒฝ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ถœ๋ ฅํ•˜๋Š” ๋‹จ๊ณ„

  • ์ปดํŒŒ์ผ๋Ÿฌ๋กœ์จ ๋ฐ”๋ฒจ ํ”Œ๋Ÿฌ๊ทธ์ธ(๊ตฌ๋ฌธ ๋ณ€ํ˜•)๊ณผ ํด๋ฆฌํ•„์ด ํ•˜๋Š” ์ผ(๋‚ด์žฅ๋œ ํ•จ์ˆ˜/๊ฐ์ฒด ๊ตฌํ˜„ )์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

    • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

      ๊ตฌ๋ฌธ ๋ณ€ํ˜•์œผ๋กœ ์ด์ „ ๋ฒ„์ „์˜ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

      // ์ปดํŒŒ์ผ ์ „const sum = (a, b) => a + b;
      // ์ปดํŒŒ์ผ ํ›„'use strict';
      var sum = function sum(a, b) {    return a + b;};
    • Promise

      Promise ๋Š” ES6์—์„œ ์ถ”๊ฐ€๋œ ํ‘œ์ค€ ๋‚ด์žฅ ๊ฐ์ฒด(standard built-in object)์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌ๋ฌธ ๋ณ€ํ˜•์œผ๋กœ ์ด์ „ ๋ฒ„์ „์˜ ์ฝ”๋“œ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์œ„ํ•œ ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • ๋ฐ”๋ฒจ์˜ useBuiltIns ์˜ต์…˜

    • ๊ธฐ๋ณธ์ ์œผ๋กœ import 'core-js' ๋Š” core-js ์˜ ๋ชจ๋“  ํด๋ฆฌํ•„ ๊ฐ€์ ธ์˜ด

    • useBuiltIns: entry ์˜ต์…˜์„ ์ฃผ๋ฉด import 'core-js' ์—์„œ "๋Œ€์ƒ ๋ธŒ๋ผ์šฐ์ €์— ํ•„์š”ํ•œ" ํด๋ฆฌํ•„์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ด

    • useBuiltIns: usage ์˜ต์…˜์„ ์ฃผ๋ฉด import ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ฝ”๋“œ๋ฅผ ์ •์  ๋ถ„์„ํ•˜์—ฌ, ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํด๋ฆฌํ•„๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.

      • ์ง€์›ํ•˜๋ ค๋Š” "๋ธŒ๋ผ์šฐ์ € ๋งˆ๋‹ค" ํ•„์š”ํ•œ ํด๋ฆฌํ•„๋งŒ import ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”๊ฐ€? ex) ie, chrome์ด ํƒ€๊ฒŸ์ธ ๊ฒฝ์šฐ promise๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, promise ํด๋ฆฌํ•„์„ import ํ•ด์•ผํ•˜์ง€๋งŒ, ์ด๋Š” chrome์—๊ฒŒ๋Š” ๋ถˆํ•„์š”ํ•˜๋‹ค.

      • ๋ฒˆ๋“ค์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ๊นŒ์ง€ ์ตœ์ ํ™” ํ•˜๋ ค๋ฉด ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ User-agent ๊ธฐ๋ฐ˜ ๊ฐ์ง€๋ฅผ ํ•ด์•ผ ๋˜๋Š”๋ฐ, ์ด๋Š” ๋ฆฌ์†Œ์Šค๋ž‘ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ ๋‹ค.

        zloirock/core-js

        [Feature Request] Polyfill using dynamic import. ยท Issue #518 ยท zloirock/core-js

      • module , nomodule ์˜ ์ง€์› ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋ฒˆ๋“ค๋ง์„ ๋‚˜๋ˆ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„์žˆ๋‹ค.

        Serve modern code to modern browsers for faster page loads


ยท ์•ฝ 4๋ถ„

์ผ๋ฐ˜ ํ•จ์ˆ˜ vs ํ™”์‚ดํ‘œ ํ•จ์ˆ˜#

const shape = {    radius: 10,    diameter() {        return this.radius * 2;    },    arrowDiameter: () => {        return this.radius * 2;    },};
console.log(shape.diameter());// 20console.log(shape.arrowDiameter());// NaN
const diameter = shape.diameter;const arrowDiameter = shape.arrowDiameter;
console.log(diameter());// NaNconsole.log(arrowDiameter());// NaN
function Shape() {    this.radius = 10;    this.diameter = function () {        return this.radius * 2;    };    this.arrowDiameter = () => {        return this.radius * 2;    };}
const shape = new Shape();
console.log(shape.diameter());// 20console.log(shape.arrowDiameter());// 20
const diameter = shape.diameter;const arrowDiameter = shape.arrowDiameter;
console.log(diameter());// NaNconsole.log(arrowDiameter());// 20
  • ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœํ•  ๋•Œ ๋™์ ์œผ๋กœ this ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์„ ์–ธํ•  ๋•Œ ์ •์ ์œผ๋กœ this ๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. (์–ธ์ œ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.)

  • ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. โ‡’ constructor ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค. โ‡’ constructor ํ•จ์ˆ˜๋กœ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋‹ค.


์ƒ์„ฑ์ž ํ•จ์ˆ˜(constructor)์™€ ํ”„๋กœํ† ํƒ€์ž…(prototype)#

function Person(name, age) {    this.name = name;    this.age = age;}
// Person.prototype = { constructor: function Person(...) { ... } }// Person.prototype.constructor = function Person(...) { ... }
const foo = new Person('foo', 30);// foo: Person { name: 'foo', age: 30 }// foo.__proto__: { constructor: function Person(...) { ... } }// foo.__proto__.constructor = function Person(...) { ... }

2020-11-06-201106-image-0


2020-11-06-201106-image-1

โ˜ __proto__ ๋Š” ECMAScript์˜ ์ŠคํŽ™์ด ์•„๋‹Œ ์ผ๋ถ€ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ, [[Prototype]] ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์†์„ฑ์ด๋‹ค.

function Person(name) {    this.name = name;    this.getName = function () {        return this.name;    };}
console.log(Person.prototype); // { constructor: function Person(name) { ... } }
function Child(name, age) {    Person.call(this, name);    this.age = age;    this.getAge = function () {        return this.age;    };}
console.log(Child.prototype); // { constructor: function Child(name, age) { ... } }
Child.prototype = Object.create(Person.prototype);
console.log(Object.create(Person.prototype)); // Person {}console.log(Child.prototype); // Person {}console.log(Child.prototype.constructor); // function Person(name) { ... }
Child.prototype.constructor = Child;
console.log(Child.prototype);// Person { constructor: function Child(name, age) { ... } }
var child = new Child('foo', 20);
console.log(child.getName()); // 'foo'console.log(child.getAge()); // 20

ํด๋ž˜์Šค ๋ฌธ๋ฒ•์€ ๋‹จ์ง€ "๊ตฌ๋ฌธ์  ์„คํƒ•" ์ธ๊ฐ€?#

class User {    constructor(name) {        this.name = name;    }
    sayHi() {        alert(this.name);    }}
let user = new User('John');user.sayHi();
function User(name) {    this.name = name;}
User.prototype.sayHi = function () {    alert(this.name);};
let user = new User('John');user.sayHi();

ES6์˜ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์กด function + prototype ๋ฌธ๋ฒ•์˜ ์กฐํ•ฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ง€ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ "๊ตฌ๋ฌธ์  ์„คํƒ•" (syntax sugar)๋ผ๊ณ  ๋งํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  1. class ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  ํ•จ์ˆ˜์—” ํŠน์ˆ˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์ธ [[FunctionKind]]: "classConstructor" ๊ฐ€ ์ด๋ฆ„ํ‘œ์ฒ˜๋Ÿผ ๋ถ™์–ด์„œ, ์ด ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ฅผ new ์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  2. ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋Š” non-enumerable ๋กœ, for ... in ๊ตฌ๋ฌธ ๋“ฑ์˜ ๊ฐ์ฒด ์ˆœํšŒ์—์„œ๋ฉ”์†Œ๋“œ๋Š” ์ˆœํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค. (enumerable ํ”Œ๋ž˜๊ทธ๊ฐ€ false ์ด๋‹ค.)

  3. ํด๋ž˜์Šค๋Š” ํ•ญ์ƒ use strict ๋ชจ๋“œ์ด๋‹ค.

  4. ์ด์™ธ์—๋„ getter, setter, ๋ฏน์Šค์ธ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜์—์„œ์˜ new ์—ฐ์‚ฐ์ž ๋™์ž‘#

2020-11-06-201106-image-2

ยท ์•ฝ 3๋ถ„

๊ณต๋ถ€๋Š” ์–ด๋–ป๊ฒŒ?#

๊ตฌ๊ธ€๋ง#

  • ์˜์–ด vs ํ•œ๊ตญ์–ด

    ํ•œ๊ตญ์–ด๋Š” ์ปจํ…์ธ ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค. ๊ณต์‹ ์‚ฌ์ดํŠธ๋ฅผ ๋ณด์ž.

MDN#

stackoverflow#

  • ์งˆ๋ฌธ์„ ๋‚จ๊ธฐ๊ณ  ๋‹ต๋ณ€์„ ๋‹ฌ์•„๋ผ

๋””๋ฒ„๊น…#

  • ์ธ์ƒ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์„ ๋””๋ฒ„๊น…์— ์Ÿ๋Š”๋‹ค

  • ๋””๋ฒ„๊น…ํ•˜๋ฉด์„œ ํ•™์Šตํ•˜๋ผ

  • this , closure ๋“ฑ๋“ฑ ์–ด๋ ค์šด ๊ฐœ๋…์€ ๋””๋ฒ„๊น… ์ฐฝ์„ ๋„์šฐ๊ณ  ์ฝœ ์Šคํƒ์— ์Œ“์ธ ์ง€์—ญ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ญ”์ง€ ๋ณด๋ฉด์„œ ํ•™์Šต

  • ๋””๋ฒ„๊น… ์ฃผ๋„ ํ•™์Šต

  • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฌด์‹œํ•˜์ง€ ๋งˆ๋ผ

    ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ž์ฃผ ๋ด์•ผ์ง€ ๋‹ค์Œ ๋ฒˆ์— ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ  ์ƒํ™ฉ์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Œ

JS์˜ ํ‘œ์ค€#

  • ECMAScript

  • ES 2015 == ES6

  • prototype ๋ชฐ๋ผ๋„ ๊ฐœ๋ฐœํ•  ์ˆœ ์žˆ์ง€๋งŒ, JS์˜ ํ•ต์‹ฌ์ด prototype ์ด๋‹ค. ๊ผญ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ#

ํ˜„์‹ค ์„ธ๊ณ„์— ์žˆ๋Š” ์‚ฌ๋ฌผ. ์‹ค์กดํ•˜๋Š” ๊ฒƒ.

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์€ ์—ญํ• 

์—ญํ• ์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

new ํ‚ค์›Œ๋“œ ์ƒ์„ฑ์ž, ์†์„ฑ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

์Šคํƒ€๋ฒ…์Šค ์ปคํ”ผ, ๋ฐ”๋ฆฌ์Šคํƒ€์˜ ์˜ˆ์‹œ

์˜์กด์„ฑ์ด ๋‚ฎ์€ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์—ฐ๊ฒฐ์„ ๋Š์Šจํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. โ†’ ๋””์ž์ธ ํŒจํ„ด

์˜์กด์„ฑ์ด ๋‚ฎ์•„์„œ ์ˆ˜์ •์ด ๋˜๋„ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ

์ฝ”๋”ฉ๋ณด๋‹ค ๋””์ž์ธ

๋ฉ”์†Œ๋“œ vs ํ”„๋กœํ† ํƒ€์ž…#


๋ฉ”์†Œ๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€

ํ”„๋กœํ† ํƒ€์ž…์€ ๊ฐ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‰์–ด ํ•จ.

module vs import#

์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜์™€ private#

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

JavaScript๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘

then์ด ์‹คํ–‰๋œ ๊ฒŒ ์•„๋‹ˆ๋ผ then์— ๋“ฑ๋ก๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ํด๋กœ์ €

  • ์ด๋ฒคํŠธ ๋ฃจํ”„


ยท ์•ฝ 2๋ถ„

Ajax#

Ajax(Asynchronous JavaScript and XML)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ์‹์„์˜๋ฏธ


JSON#

JSON

JSON(JavaScript Object Notation)

JavaScript์—์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹์„ ์˜๋ฏธ

์ด ํ‘œํ˜„์‹์€ ์‚ฌ๋žŒ๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ธฐ๊ณ„๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉด์„œ ๋ฐ์ดํ„ฐ์˜ ์šฉ๋Ÿ‰์ด ์ž‘๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ ์ตœ๊ทผ์—๋Š” JSON์ด XML์„ ๋Œ€์ฒดํ•ด์„œ ์„ค์ •์˜ ์ €์žฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก๋“ฑ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.


{    "coord": {"lon": 139, "lat": 35},    "weather": [        {            "id": 800,            "main": "Clear",            "description": "clear sky",            "icon": "01n"        }    ],    "base": "stations",    "main": {        "temp": 281.52,        "feels_like": 278.99,        "temp_min": 280.15,        "temp_max": 283.71,        "pressure": 1016,        "humidity": 93    },    "wind": {        "speed": 0.47,        "deg": 107.538    },    "clouds": {        "all": 2    },    "dt": 1560350192,    "sys": {        "type": 3,        "id": 2019346,        "message": 0.0065,        "country": "JP",        "sunrise": 1560281377,        "sunset": 1560333478    },    "timezone": 32400,    "id": 1851632,    "name": "Shuzenji",    "cod": 200}

JSON API#

JSON.parse()#

์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๋ฌธ์ž์—ด์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

JSON.stringify()#

์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.


ยท ์•ฝ 12๋ถ„

NPM#

NPM1 - YouTube

Node Package Manager : ์•ฑ์Šคํ† ์–ด์—์„œ ์•ฑ์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ NPM์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ• ์ˆ˜ ์žˆ์Œ.

ํŒจํ‚ค์ง€๋Š” -g (global)์— ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ถ€ํ’ˆ์œผ๋กœ์จ ์‚ฌ์šฉํ•˜๋„๋ก์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ฒ€์ƒ‰๊ณผ ์„ค์น˜#

npm

NPM์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ


๋งŒ์•ฝ local-web-server ๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ,

  • npm i local-web-server

  • npm install local-web-server

i๋Š” install์˜ ์•ฝ์ž


์ปดํ“จํ„ฐ์˜ ์ „์—ญ์ ์ธ, ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ,

  • npm install -g local-web-server

g๋Š” global์˜ ์•ฝ์ž

๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด sudo ๋ฅผ ์•ž์— ์ถ”๊ฐ€ํ•œ๋‹ค.


ํŒจํ‚ค์ง€ ๋ชฉ๋ก ๋ณด๊ธฐ์™€ ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ#

ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ณด๊ธฐ

npm list

์ „์—ญ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ณด๊ธฐ

npm list -g

์ „์—ญ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ์ค‘ ์ œ์ผ ์ƒ๋‹จ์— ์žˆ๋Š” ํŒจํ‚ค์ง€๋งŒ ๋ณด๊ธฐ

npm list -g --depth=0

์ „์—ญ์— ์žˆ๋Š” ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

npm update -g local-web-server

์ „์—ญ์— ์žˆ๋Š” ํŒจํ‚ค์ง€ ์‚ญ์ œํ•˜๊ธฐ

npm uninstall -g local-web-server


๐Ÿ“Œ ๋ฐ”ํ€ด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์ง€ ๋งˆ๋ผ!


React#

React - YouTube

React ์•ฑ ๋งŒ๋“ค๊ธฐ#

  • npm install -g create-react-app - ์ „์—ญ์— ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.
npm install -g create-react-appmkdir my-appcd my-appcreate-react-app .

  • npx - ์ž„์‹œ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์ง€์šฐ๋Š” ์‹คํ–‰ ๋„๊ตฌ.
npx create-react-app my-appcd my-appnpm start

React ์•ฑ ์‹คํ–‰#

npm run start


์ฝ”๋”ฉํ•˜๊ธฐ#

public ๋””๋ ‰ํ† ๋ฆฌ - static ์ž์›์ด ์œ„์น˜ํ•œ ๊ณณ.#

  • index.html
<div id="root"></div>

์ด root ์•ˆ์— ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.


src ๋””๋ ‰ํ† ๋ฆฌ - source ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ณณ.#

  • index.js
ReactDOM.render(<App />, document.getElementById('root'));

<App /> ์ปดํฌ๋„ŒํŠธ๋ฅผ root ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ๋œ๋‹ค.


  • App.js ํด๋ž˜์Šคํ˜• (ํด๋ž˜์Šคํ˜•๊ณผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ๊ฐ•์ขŒ๋Š” ํด๋ž˜์Šคํ˜•์œผ๋กœ์ง„ํ–‰)
import React from 'react';import logo from './logo.svg';import './App.css';
class App extends React.Component {    render() {        return (            <div className="App">                <header className="App-header">                    <img src={logo} className="App-logo" alt="logo" />                    <p>                        Edit <code>src/App.js</code> and save to reload.                    </p>                    <a                        className="App-link"                        href="https://reactjs.org"                        target="_blank"                        rel="noopener noreferrer"                    >                        Learn React                    </a>                </header>            </div>        );    }}
export default App;

โ˜๏ธ ๋ฐ˜๋“œ์‹œ ๋ฆฌ์•กํŠธ๋Š” ๋ฐ˜ํ™˜ํ•  ๋•Œ ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค.


๋ฐฐํฌํ•˜๊ธฐ#

  • npm run build - ๋ฆฌ์•กํŠธ ์•ฑ์„ ๋นŒ๋“œํ•ด์คŒ

  • npx serve -s build - ๋นŒ๋“œํ•œ ์•ฑ์œผ๋กœ ๋กœ์ปฌ ํ˜ธ์ŠคํŒ…


JSX#

๐Ÿ“Œ JSX๋Š” JavaScript๊ฐ€ ์•„๋‹ˆ๋‹ค!

JSX๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” create-react-app์— ์˜ํ•ด JavaScript ์ฝ”๋“œ๋กœ ์ปจ๋ฒ„ํŒ… ๋œ๋‹ค.


Hello World!#

import React from 'react';import './App.css';
class App extends React.Component {    render() {        return <div className="App">Hello World!</div>;    }}
export default App;

App class๋Š” ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™•์žฅํ•˜๊ณ  render ๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. (ํ•„์ˆ˜), ํด๋ž˜์Šค ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ์—์„œ function ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค. (ES6)


Components ์™€ props#

์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•  ๋•Œ ์™„์ „ํžˆ ๋˜‘๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŠน์ • ์†์„ฑ์„ ๊ฐ€์ง์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•ด์ค„ ์ˆ˜ ์žˆ๋„๋ก props ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import React from 'react';import './App.css';
class Subject extends React.Component {    render() {        return (            <header>                <h1>{this.props.title}</h1>                {this.props.sub}            </header>        );    }}
class App extends React.Component {    render() {        return (            <div className="App">                <Subject title="WEB" sub="World Wide Web!" />                <Subject title="React" sub="For UI!" />            </div>        );    }}
export default App;

React Developer Tools#

React Developer Tools


์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ#

App.js

import React from 'react';import Subject from './components/Subject';import Content from './components/Content';import TOC from './components/TOC';import './App.css';
class App extends React.Component {    render() {        return (            <div className="App">                <Subject title="WEB" sub="World Wide Web!" />                <Subject title="React" sub="For UI!" />                <Content text="HTML is FUN!" />                <TOC />            </div>        );    }}
export default App;

import React from 'react'; - ๋ฆฌ์•กํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜.

ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋Š” import ์— ๋ช…์‹œ.

ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก export ์— ๋ช…์‹œ.


props ์™€ state#

2020-03-17-200317-image-0

props ๋Š” ์™ธ๋ถ€์—์„œ, ๋‚ด๋ถ€๋กœ ์ „๋‹ฌ. ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ์— ์†์„ฑ์— ๊ธฐ์ž…ํ•˜๋ฉด ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์—์„œ props ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ. ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ ์กฐ์ž‘.

state ๋Š” ๋‚ด๋ถ€์˜ ์ƒํƒœ ๊ฐ’.


App.js

import React from 'react';import Subject from './components/Subject';import TOC from './components/TOC';import Content from './components/Content';import './App.css';
class App extends React.Component {    constructor(props) {        super(props);        this.state = {            subject: {title: 'WEB', sub: 'World Wide Web!'},        };    }    render() {        return (            <div className="App">                <Subject                    title={this.state.subject.title}                    sub={this.state.subject.sub}                />                <Subject title="React" sub="For UI!" />                <TOC />                <Content text="HTML is FUN!" />            </div>        );    }}
export default App;

constructor : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜ ( state ๊ฐ’์„ ์ดˆ๊ธฐํ™”)

ํ•ด๋‹น ๊ฐ์ฒด ์•ˆ์—์„œ { this.state.subject.title } ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.


TOC ๊ฐœ์„ #

TOC.js

import React from 'react';
class TOC extends React.Component {    render() {        var lists = [];        var data = this.props.data;        var i = 0;
        while (i < data.length) {            lists.push(                <li key={data[i].id}>                    <a href={'/content/' + data[i].id}>{data[i].title}</a>                </li>,            );            i = i + 1;        }
        return (            <nav>                <ul>{lists}</ul>            </nav>        );    }}
export default TOC;

TOC.js ์—์„œ ์™ธ๋ถ€์—์„œ data (๊ฐ์ฒด๊ฐ€ ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ)๋ฅผ props ๋กœ ์ „๋‹ฌ๋ฐ›๊ณ , ํ•ด๋‹น๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ lists ์— ๋‹ด์•„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋ฐ”๊พผ๋‹ค.

์ด ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชฉ๋ก์€ key ๋ฅผ ๊ฐ€์ ธ์•ผํ•œ๋‹ค. key={data[i].id} ๊ฐ€ ํ•„์ˆ˜.

ํ‚ค๋ฅผ ๊ธฐ์ž…ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ.

2020-03-17-200317-image-1


App.js

import React from 'react';import Subject from './components/Subject';import TOC from './components/TOC';import Content from './components/Content';import './App.css';
class App extends React.Component {    constructor(props) {        super(props);        this.state = {            subject: {title: 'WEB', sub: 'World Wide Web!'},            contents: [                {id: 1, title: 'HTML', desc: 'HTML is for information'},                {id: 2, title: 'CSS', desc: 'CSS is for Design'},                {id: 3, title: 'JavaScript', desc: 'JavaScript is for Interactive'},            ],        };    }    render() {        return (            <div className="App">                <Subject                    title={this.state.subject.title}                    sub={this.state.subject.sub}                />                <TOC data={this.state.contents} />                <Content text="HTML is FUN!" />            </div>        );    }}
export default App;

์ด๋ ‡๊ฒŒ ์™ธ๋ถ€์—์„œ Contents ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด๋ฒคํŠธ state , props , render() ํ•จ์ˆ˜#

React ์—์„œ๋Š” props ๋˜๋Š” state ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ render() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ์•ฝ์†๋˜์–ด ์žˆ๋‹ค. โ†’ ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ง„๋‹ค.


๋™์ ์œผ๋กœ ๋ณ€์ˆ˜ ์ œ์–ด#

Subject.title ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ, this.state.mode ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค. ์ด ๋•Œ Subject.title ์€ <a> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋‹ค.

onClick ์†์„ฑ์œผ๋กœ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜(์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ)๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ onClick ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ™”๋ฉด์ด ์ƒˆ๋กœ๊ณ ์นจ ๋œ๋‹ค. <a> ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ.


...
<h1><a href="/" onClick={function(e){  console.log(e);    // debugger;  e.preventDefault();}}>{this.state.subject.title}</a></h1>
...

โ˜๏ธ debugger; ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น ์œ„์น˜์—์„œ ๋ฉˆ์ถฐ์ง€๊ณ  ๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ ํ•ด๋‹น์œ„์น˜์˜ ์†Œ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ


์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘๋ฐฉ๋ฒ•์„ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ๊ฒƒ์ด event ๊ฐ์ฒด์˜ preventDefault() ๋ผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ๊ณ ์นจ๋˜๋Š” ํ˜„์ƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.


state ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ.

return (    <div className="App">        <header>            <h1>                <a                    href="/"                    onClick={function (e) {                        e.preventDefault();                        this.setState({                            mode: 'welcome',                        });                    }.bind(this)}                >                    {this.state.subject.title}                </a>            </h1>            {this.state.subject.sub}        </header>        <TOC data={this.state.contents} />        <Content title={_title} desc={_desc} />    </div>);
  • ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋์„ ๋•Œ ์‹คํ–‰๋˜๋Š” function ๋‚ด๋ถ€์— this ์˜ ๊ฐ’์ด ์•„๋ฌด๊ฒƒ๋„ ์„ธํŒ…๋˜์–ด์žˆ์ง€ ์•Š๋‹ค. โ†’ this ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉํ•ด์•ผํ•จ. ํ•จ์ˆ˜ ์•ˆ์˜ this ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•จ. ( this = App )

  • state ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ๋• setState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ


React์—์„œ ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด state ๋ณ€๊ฒฝ#

React์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ state ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ render ํ•จ์ˆ˜์™€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ render ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด reload ํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๋Š” ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์—†๋‹ค๋ฉด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด React.Component ์˜ shouldComponentUpdate ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

shouldComponentUpdate ๋Š” newProps ์™€ newState ๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค. ์—ฌ๊ธฐ์„œ newProps ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ”๋€ props ๊ฐ’์„ ๋งํ•œ๋‹ค.

newProps ์™€ ์ด์ „ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” this.props.data ๋ฅผ ์ด์šฉํ•ด props ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„๋•Œ๋งŒ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ render ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋‘˜์ด ๊ฐ™์œผ๋ฉด false ๋ฆฌํ„ดํ•˜๊ณ  ๋‘˜์ด ๋‹ค๋ฅด๋ฉด true ๋ฅผ ๋ฆฌํ„ดํ•จ์œผ๋กœ ๊ฐ€๋Šฅ)

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ state ์— ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์ด ์žˆ์„ ๊ฒฝ์šฐ์—, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด state ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋˜๋ฉด(์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์—ด์˜ push ํ•จ์ˆ˜๋Š” ์›๋ณธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.) ์›๋ณธ์ด ์ˆ˜์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— newProps ์™€ this.props.data ๋Š” ๊ฐ™์„ ์ˆ˜๋ฐ–์— ์—†๊ณ , ๋”ฐ๋ผ์„œ shouldComponentUpdate ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ณ  ์ด๋Š” ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์—์„œ๋Š” push ํ•จ์ˆ˜ ๋Œ€์‹  concat , ๊ฐ์ฒด์—์„œ๋Š” Object.assign ํ•จ์ˆ˜ ๋“ฑ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋กœ state ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์œผ๋กœ shouldComponentUpdate ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ์กฐ์ž‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ยท ์•ฝ 5๋ถ„

React#

๋ฒจ๋กœํผํŠธ์™€ ํ•จ๊ป˜ํ•˜๋Š” ๋ชจ๋˜ ๋ฆฌ์•กํŠธ


React Component ๋งŒ๋“ค๊ธฐ#

Hello.js

import React from 'react';
function Hello() {    return <div>Hello World!</div>;}
export default Hello;

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•

import React from 'react';

๋ฅผ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค.

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” XML ํ˜•์‹์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ JSX ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

export default Hello;

์ด ์ฝ”๋“œ๋Š” Hello ๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๊ฒ ๋‹ค๋Š” ์˜๋ฏธ.

App.js

import React from 'react';import Hello from './Hello';
function App() {    return (        <div>            <Hello />        </div>    );}
export default App;

์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด, ( yarn start or npm start )

2020-03-14-200314-image-0

index.js

import React from 'react';import ReactDOM from 'react-dom';import './index.css';import App from './App';import * as serviceWorker from './serviceWorker';
ReactDOM.render(<App />, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change// unregister() to register() below. Note this comes with some pitfalls.// Learn more about service workers: https://bit.ly/CRA-PWAserviceWorker.unregister();

์—ฌ๊ธฐ์„œ ReactDOM.render ๋ฅผ ๋ณด๋ฉด, id ๊ฐ€ root ์ธ DOM ๋‚ด๋ถ€์— ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ( <App /> )๋ฅผ ๋ Œ๋”๋งํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ด DOM์€ public/index.html ๋‚ด๋ถ€์— ์žˆ๋‹ค.

<div id="root"></div>

JSX#

JavaScript + XML, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ ๋ฌธ๋ฒ•. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์— ๋งˆํฌ์—… ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ. HTML ๊ฐ™์ด ์ƒ๊ฒผ์ง€๋งŒ ์‹ค์ œ๋ก  JS ์ด๋‹ค.

return <div>์•ˆ๋…•ํ•˜์„ธ์š”</div>;

Babel ์€ XML ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ JS๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

๊ทœ์น™#

  • ํƒœ๊ทธ๋ฅผ ์—ด์—ˆ์œผ๋ฉด ๋‹ซ์•„์•ผ ํ•จ. ( input , br ํฌํ•จ ๋ชจ๋“  ํƒœ๊ทธ. ํƒœ๊ทธ ์‚ฌ์ด์— ๋‚ด์šฉ์ด์—†์„ ๋•, <input/> ๋กœ ์…€ํ”„ํด๋กœ์ง• ๊ฐ€๋Šฅ)

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ํƒœ๊ทธ๋Š” ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค. <> </> Fragment๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ํƒœ๊ทธ ์—†์ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ํƒœ๊ทธ ๊ฐ€๋Šฅ.

  • JSX ๋‚ด๋ถ€์— ๋ณ€์ˆ˜๋Š” {} ๋กœ ๊ฐ์‹ธ์„œ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Œ.


style ๊ณผ className#

style ๊ณผ CSS class ์„ค์ • ๋ฐฉ๋ฒ•์ด HTML๊ณผ ๋‹ค๋ฅด๋‹ค.

  • ์ธ๋ผ์ธ ์Šคํƒ€์ผ์€ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์ž‘์„ฑ.

  • background-color ๊ฐ™์ด - ๋กœ ๊ตฌ๋ถ„๋œ ์†์„ฑ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์†์„ฑ๋“ค์€ camelCase ํ˜•ํƒœ๋กœ ( backgroundColor )

  • CSS class ์„ค์ •์‹œ์—” class="" ๊ฐ€ ์•„๋‹Œ className="" ์œผ๋กœ.

App.js

import React from 'react';import Hello from './Hello';import './App.css';
function App() {    const name = 'react';    const style = {        backgroundColor: 'black',        color: 'aqua',        fontSize: 24, // ๊ธฐ๋ณธ ๋‹จ์œ„ px        padding: '1rem', // ๋‹ค๋ฅธ ๋‹จ์œ„ ์‚ฌ์šฉ ์‹œ ๋ฌธ์ž์—ด๋กœ ์„ค์ •    };
    return (        <>            <Hello />            <div style={style}>{name}</div>            <div className="gray-box"></div>        </>    );}
export default App;

App.css

.gray-box {    background: gray;    width: 64px;    height: 64px;}

์ฃผ์„#

{/* JSX ๋‚ด๋ถ€ ์ฃผ์„ ์ž‘์„ฑ๋ฒ• */}

์—ด๋ฆฌ๋Š” ํƒœ๊ทธ ๋‚ด๋ถ€์—์„œ๋Š” // ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ์ฃผ์„ ์ž‘์„ฑ๋„ ๊ฐ€๋Šฅ


props ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์— ๊ฐ’ ์ „๋‹ฌ#

App ์ปดํฌ๋„ŒํŠธ์—์„œ Hello ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

App.js

import React from 'react';import Hello from './Hello';
function App() {    return <Hello name="react" />;}
export default App;

Hello.js

import React from 'react';
function Hello(props) {    return <div>์•ˆ๋…•ํ•˜์„ธ์š” {props.name}</div>;}
export default Hello;

props ๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์กฐํšŒ, ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋˜๋ฏ€๋กœ props.name ์œผ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅ


๋น„๊ตฌ์กฐํ™” ํ• ๋‹น#

App.js

import React from 'react';import Hello from './Hello';
function App() {    return <Hello name="react" color="red" />;}
export default App;

name , color ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ์ „๋‹ฌ.

import React from 'react';
function Hello(props) {    return <div style={{color: props.color}}>์•ˆ๋…•ํ•˜์„ธ์š” {props.name}</div>;}
export default Hello;

color: props.color ๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ {} ๋กœ ํ•œ ๋ฒˆ ๊ฐ์‹ธ๊ณ , ์ด ๊ฐ์ฒด๊ฐ€ JS ๊ฐ’์ด๋ฏ€๋กœ {} ๋กœ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ผ๋‹ค.


๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์œผ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

import React from 'react';
function Hello({color, name}) {    return <div style={{color}}>์•ˆ๋…•ํ•˜์„ธ์š” {name}</div>;    // color: color -> color ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ}
export default Hello;

ยท ์•ฝ 9๋ถ„

React-Native ์‹คํ–‰ ํ™˜๊ฒฝ์„ค์ •#

๋งฅ(Mac)์— react native ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ

์ด ๋ธ”๋กœ๊ทธ์˜ ์„ค์ • ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ React-Native ์‹คํ–‰ํ™˜๊ฒฝ์„ ์„ค์ •ํ–ˆ๋‹ค.


  ![2020-03-13-200313-image-0](./images/2020-03-13-200313-image-0.png)
  <br />


  ![2020-03-13-200313-image-1](./images/2020-03-13-200313-image-1.png)
  <br />

์„ฑ๊ณต!

JavaScript ๋ฌธ๋ฒ•#

์‚ผํ•ญ์—ฐ์‚ฐ์ž#

condition ? true : false

  • ํ•œ ์ค„์ด ๋„ˆ๋ฌด ๊ธธ ๋•Œ
let text = array.length === 0 ? `๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋‹ค.` : `๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค`;

Truthy and Falsy#

undefined ์™€ null ์€ ๋ชจ๋‘ false ๋กœ ๊ฐ„์ฃผ๋จ.

Falsy ํ•œ ๊ฐ’

  • undefined

  • null

  • 0

  • 
    
  • NaN

  • false

์ด ์™ธ์—๋Š” ๋ชจ๋‘ true ๋กœ ๊ฐ„์ฃผ๋จ

! , !! ๋ฅผ ํ™œ์šฉํ•ด Falsy ํ•œ ๊ฐ’๊ณผ Truthy ํ•œ ๊ฐ’์„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ


๋‹จ์ถ• ํ‰๊ฐ€ ๋…ผ๋ฆฌ ๊ณ„์‚ฐ๋ฒ•#

A && B ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ A๊ฐ€ Truthy ํ•œ ๊ฐ’์ด๋ผ๋ฉด, B๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋˜๊ณ , Falsy ํ•œ ๊ฐ’์ด๋ผ๋ฉด, A๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

console.log(true && 'hello'); // helloconsole.log(false && 'hello'); // falseconsole.log('hello' && 'bye'); // byeconsole.log(null && 'hello'); // nullconsole.log(undefined && 'hello'); // undefinedconsole.log('' && 'hello'); // ''console.log(0 && 'hello'); // 0console.log(1 && 'hello'); // helloconsole.log(1 && 1); // 1

A || B ์—ฐ์‚ฐ์ž๋Š” ๋งŒ์•ฝ A๊ฐ€ Truthy ํ•œ ๊ฐ’์ด๋ผ๋ฉด, A๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋˜๊ณ , Falsy ํ•œ๊ฐ’์ด๋ผ๋ฉด B๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

console.log(true || 'hello'); // trueconsole.log(false || 'hello'); // helloconsole.log('hello' || 'bye'); // helloconsole.log(null || 'hello'); // helloconsole.log(undefined || 'hello'); // undefinedconsole.log('' || 'hello'); // helloconsole.log(0 || 'hello'); // helloconsole.log(1 || 'hello'); // 1console.log(1 || 1); // 1

ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ#

ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ = ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

function calculateCircleArea(r = 1) {    return Math.PI * r * r;}
const area = calculateCircleArea();console.log(area); // 3.141592653589793

์กฐ๊ฑด๋ฌธ ๋” ์Šค๋งˆํŠธํ•˜๊ฒŒ ์“ฐ๊ธฐ#

  • ํŠน์ • ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•  ๋•Œ
function isAnimal(text) {    return (        text === '๊ณ ์–‘์ด' || text === '๊ฐœ' || text === '๊ฑฐ๋ถ์ด' || text === '๋„ˆ๊ตฌ๋ฆฌ'    );}
console.log(isAnimal('๊ฐœ')); // trueconsole.log(isAnimal('๋…ธํŠธ๋ถ')); // false

๋ฐฐ์—ด์˜ includes ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

function isAnimal(name) {    const animals = ['๊ณ ์–‘์ด', '๊ฐœ', '๊ฑฐ๋ถ์ด', '๋„ˆ๊ตฌ๋ฆฌ'];    return animals.includes(name);}
console.log(isAnimal('๊ฐœ')); // trueconsole.log(isAnimal('๋…ธํŠธ๋ถ')); // false

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ

const isAnimal = (name) => ['๊ณ ์–‘์ด', '๊ฐœ', '๊ฑฐ๋ถ์ด', '๋„ˆ๊ตฌ๋ฆฌ'].includes(name);
console.log(isAnimal('๊ฐœ')); // trueconsole.log(isAnimal('๋…ธํŠธ๋ถ')); // false

  • ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•  ๋•Œ
function getSound(animal) {    if (animal === '๊ฐœ') return '๋ฉ๋ฉ!';    if (animal === '๊ณ ์–‘์ด') return '์•ผ์˜น~';    if (animal === '์ฐธ์ƒˆ') return '์งน์งน';    if (animal === '๋น„๋‘˜๊ธฐ') return '๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ';    return '...?';}

switch ์‚ฌ์šฉ

function getSound(animal) {    switch (animal) {        case '๊ฐœ':            return '๋ฉ๋ฉ!';        case '๊ณ ์–‘์ด':            return '์•ผ์˜น~';        case '์ฐธ์ƒˆ':            return '์งน์งน';        case '๋น„๋‘˜๊ธฐ':            return '๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ';        default:            return '...?';    }}
console.log(getSound('๊ฐœ')); // ๋ฉ๋ฉ!console.log(getSound('๋น„๋‘˜๊ธฐ')); // ๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ

๊ฐ์ฒด ํ™œ์šฉ

function getSound(animal) {    const sounds = {        ๊ฐœ: '๋ฉ๋ฉ!',        ๊ณ ์–‘์ด: '์•ผ์˜น~',        ์ฐธ์ƒˆ: '์งน์งน',        ๋น„๋‘˜๊ธฐ: '๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ',    };    return sounds[animal] || '...?';}
console.log(getSound('๊ฐœ')); // ๋ฉ๋ฉ!console.log(getSound('๋น„๋‘˜๊ธฐ')); // ๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ

  • ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•  ๋•Œ
function makeSound(animal) {    const tasks = {        ๊ฐœ() {            console.log('๋ฉ๋ฉ');        },        ๊ณ ์–‘์ด() {            console.log('๊ณ ์–‘์ด');        },        ๋น„๋‘˜๊ธฐ() {            console.log('๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ');        },    };    if (!tasks[animal]) {        console.log('...?');        return;    }    tasks[animal]();}
makeSound('๊ฐœ');makeSound('๋น„๋‘˜๊ธฐ');

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น (๊ตฌ์กฐ๋ถ„ํ•ด) ๋ฌธ๋ฒ•#

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น#

const object = {a: 1, b: 2};
const {a, b} = object;
console.log(a); // 1console.log(b); // 2
  • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ
const object = {a: 1, b: 2};
function print({a, b}) {    console.log(a);    console.log(b);}
print(object);

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์‹œ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •#

const object = {a: 1};
const {a, b = 2} = object;
console.log(a); // 1console.log(b); // 2
  • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ
const object = {a: 1};
function print({a, b = 2}) {    console.log(a);    console.log(b);}
print(object);// 1// 2

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์‹œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ#

const animal = {    name: '๋ฉ๋ฉ์ด',    type: '๊ฐœ',};
const nickname = animal.name;
console.log(nickname); // ๋ฉ๋ฉ์ด

animal.name ๊ฐ’์„ nickname ๊ฐ’์— ๋‹ด๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด,

const animal = {    name: '๋ฉ๋ฉ์ด',    type: '๊ฐœ',};
const {name: nickname} = animal;console.log(nickname);

: ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์žˆ๋‹ค.


๋ฐฐ์—ด ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น#

const array = [1, 2];const [one, two] = array;
console.log(one);console.log(two);

๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋ฅผ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ƒˆ๋กœ ์„ ์–ธํ•ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉ. ๊ฐ์ฒด ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •์ด ๊ฐ€๋Šฅ.

const array = [1];const [one, two = 2] = array;
console.log(one);console.log(two);

๊นŠ์€ ๊ฐ’ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น#

const deepObject = {    state: {        information: {            name: 'younho9',            languages: ['korean', 'english', 'chinese'],        },    },    value: 5,};

์—ฌ๊ธฐ์„œ name , languages , value ๊ฐ’์„ ๋ฐ–์œผ๋กœ ๊บผ๋‚ด๊ณ  ์‹ถ์„ ๋•Œ

const deepObject = {    state: {        information: {            name: 'younho9',            languages: ['korean', 'english', 'chinese'],        },    },    value: 5,};
const {name, languages} = deepObject.state.information;const {value} = deepObject;
const extracted = {    name,    languages,    value,};
console.log(extracted); // {name: "younho9", languages: Array[3], value: 5}

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

const extracted = {    name: name,    languages: languages,    value: value,};

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€

const deepObject = {    state: {        information: {            name: 'younho9',            languages: ['korean', 'english', 'chinese'],        },    },    value: 5,};
const {    state: {        information: {name, languages},    },    value,} = deepObject;
const extracted = {    name,    languages,    value,};
console.log(extracted);

์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋‹ค๋ฃจ๊ธฐ#

2020-03-13-200313-image-2

function work() {    const start = Date.now();    for (let i = 0; i < 10000000; i++) {}    const end = Date.now();    console.log(end - start + 'ms');}
work();console.log('๋‹ค์Œ ์ž‘์—…');

work() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ ์ž‘์—…์ด ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค. โ†’ setTImeout() ํ•จ์ˆ˜ ์‚ฌ์šฉ

function work() {    setTimeout(() => {        const start = Date.now();        for (let i = 0; i < 1000000000; i++) {}        const end = Date.now();        console.log(end - start + 'ms');    }, 0);}
console.log('์ž‘์—… ์‹œ์ž‘!');work();console.log('๋‹ค์Œ ์ž‘์—…');

๋จผ์ € work() ์ดํ›„์˜ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  work() ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.

๋งŒ์•ฝ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ work() ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ ์ดํ›„์— ์–ด๋–ค ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function work(callback) {    setTimeout(() => {        const start = Date.now();        for (let i = 0; i < 1000000000; i++) {}        const end = Date.now();        console.log(end - start + 'ms');        callback();    }, 0);}
console.log('์ž‘์—… ์‹œ์ž‘!');work(() => {    console.log('์ž‘์—…์ด ๋๋‚ฌ์–ด์š”!');});console.log('๋‹ค์Œ ์ž‘์—…');

work() ๊ฐ€ ๋๋‚œ ๋’ค์— ์ˆ˜ํ–‰ํ•  ํ•จ์ˆ˜(์ž‘์—…)๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.


Promise#

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์•„์งˆ ๋•Œ, ๋ชจ๋‘ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋‚œ์žกํ•ด์ง€๊ฒŒ๋œ๋‹ค.

function increaseAndPrint(n, callback) {    setTimeout(() => {        const increased = n + 1;        console.log(increased);        if (callback) {            callback(increased);        }    }, 1000);}
increaseAndPrint(0, (n) => {    increaseAndPrint(n, (n) => {        increaseAndPrint(n, (n) => {            increaseAndPrint(n, (n) => {                increaseAndPrint(n, (n) => {                    console.log('๋!');                });            });        });    });});

์ด๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ES6์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ด Promise ์ด๋‹ค.

Promise ๋Š” ์„ฑ๊ณตํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์„ฑ๊ณตํ•  ๋•Œ๋Š” resolve ๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๊ณ , ์‹คํŒจํ•  ๋•Œ๋Š” reject ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

const myPromise = new Promise((resolve, reject) => {    setTimeout(() => {        resolve(1);    }, 1000);});
myPromise.then((n) => {    console.log(n);});

ยท ์•ฝ 6๋ถ„

๊ฐ์ฒด์ง€ํ–ฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ#

MDN ๋ฌธ์„œ

ํ•จ์ˆ˜ ๋ณต์Šต#

ํ•จ์ˆ˜ํ‘œํ˜„์‹์—์„œ ๊ธฐ๋ช…ํ•จ์ˆ˜์™€ ์ต๋ช…ํ•จ์ˆ˜


var add = function sum(a, b) {    return a + b;};

์—ฌ๊ธฐ์—์„œ sum ๊ฐ€ ํ•จ์ˆ˜ ์ด๋ฆ„, add ์ด ํ•จ์ˆ˜ ๋ณ€์ˆ˜.

ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์™ธ๋ถ€ ์ฝ”๋“œ์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€. (ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์žฌ๊ท€ ํ˜ธ์ถœ or ๋””๋ฒ„๊ฑฐ์—์„œ ํ•จ์ˆ˜ ๊ตฌ๋ถ„์„ ์œ„ํ•ด ์‚ฌ์šฉ)

ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์€ ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ํ•จ์ˆ˜ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค


ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ#


์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์„œ ์œ„์—์„œ ์ •์˜ํ•œ add ํ•จ์ˆ˜์˜ ํ”„๋กœํผํ‹ฐ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


console.dir(add);

caller : ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅ. (์ „์—ญ์ธ ๊ฒฝ์šฐ null )


function some() {    return foo();}
function foo() {    var a = 3;    return bar();}
function bar() {    return 'caller : ' + bar.caller;}
console.log(foo(bar)); // caller : function foo(func) {...}console.log(bar()); // null (browser์—์„œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ)

arguments : ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ „๋‹ฌ๋œ ์ธ์ž๊ฐ’.

arguments ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋“ค์˜

function multiply(x, y) {    console.log(arguments);    return x * y;}
multiply(); // {}multiply(1); // { '0': 1 }multiply(1, 2); // { '0': 1, '1': 2 }multiply(1, 2, 3); // { '0': 1, '1': 2, '2': 3 }

__proto__ : ์ž์‹ ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด. ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋ถ€๋ชจ๋Š” Function.prototype ๊ฐ์ฒด

length : ํ•จ์ˆ˜ ์ •์˜ ์‹œ ์ž‘์„ฑ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐฏ์ˆ˜


function foo() {}console.log(foo.length); // 0
function bar(x) {    return x;}console.log(bar.length); // 1
function baz(x, y) {    return x * y;}console.log(baz.length); // 2

prototype : ์œ„์˜ __proto__ ์™€ ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋กœ ์ด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉ๋  ๋•Œ์ดํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.


์ฝœ๋ฐฑ ํ•จ์ˆ˜#

๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ง€ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ฑฐ๋‚˜ ํŠน์ • ์‹œ์ ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ์‹œ์Šคํ…œ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜. (๋Œ€ํ‘œ์ ์œผ๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ฒ˜๋ฆฌ)


function initTmap() {    var map = new Tmapv2.Map(        'map', // "map" : ์ง€๋„๊ฐ€ ํ‘œ์‹œ๋  div์˜ id        {            center: new Tmapv2.LatLng(37.566481622437934, 126.98502302169841), // ์ง€๋„ ์ดˆ๊ธฐ ์ขŒํ‘œ            width: '100%', // map์˜ width ์„ค์ •            height: '452px', // map์˜ height ์„ค์ •            zoom: 19,        },    );    //๋‹ค๊ฐํ˜•    var polygon = new Tmapv2.Polygon({        paths: [            new Tmapv2.LatLng(37.56661, 126.985666),            new Tmapv2.LatLng(37.566595, 126.985985),            new Tmapv2.LatLng(37.566512, 126.986071),            new Tmapv2.LatLng(37.566397, 126.985894),            new Tmapv2.LatLng(37.566395, 126.985664),        ],        fillColor: 'pink',        draggable: true,        map: map,    });}
window.onload = initTmap;

์–ด์ œ ๊ณต๋ถ€ํ–ˆ๋˜ Tmap API, ๋งˆ์ง€๋ง‰์ค„์˜ window.onload = initTmap ๋กœ ์œ„์—์„œ ์ •์˜ํ•œ initTmap ํ•จ์ˆ˜๋ฅผ onload ์‹œ(์›น ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ์ด ๋๋‚˜๋Š” ์‹œ์ )์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ๋•Œ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ต๋ช… ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.


<!DOCTYPE html><html>    <body>        <script>            window.onload = function () {                alert('This is the callback function.');            };        </script>    </body></html>

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜#

ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•จ๊ณผ ๋™์‹œ์— ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜.


(function (name) {    console.log('This is the immediate function --> ' + name);})('foo');

ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์„ ๊ด„ํ˜ธ () ๋กœ ๊ฐ์‹ธ๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋์— () ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ด ๊ด„ํ˜ธ ์•ˆ์— ์ธ์ž๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ์ตœ์ดˆ ํ•œ ๋ฒˆ์˜ ์‹คํ–‰๋งŒ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ๋ถ€๋ถ„์— ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋‹ค. (๋ณ€์ˆ˜๋“ค์˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ์ „์—ญ์ด ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ ๊ฐ์ถ”๋Š” ํšจ๊ณผ)

์ฆ‰์‹œ ์‹คํ–‰ํ•จ์ˆ˜๋Š” ์ตœ์ดˆ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฉฐ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.


๋‚ด๋ถ€ ํ•จ์ˆ˜#

ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ •์˜๋œ ํ•จ์ˆ˜.

ํด๋กœ์ € ์ƒ์„ฑ์ด๋‚˜ ์™ธ๋ถ€์—์„œ์˜ ์ ‘๊ทผ์„ ๋ง‰๊ณ  ๋…๋ฆฝ์ ์ธ ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ

  • ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ๋Š” ์ž์‹ ์„ ๋‘˜๋Ÿฌ์‹ผ ๋ถ€๋ชจ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

  • ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์‹ ์ด ์ •์˜๋œ ๋ถ€๋ชจ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

์™ธ๋ถ€์—์„œ ํŠน์ • ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๋ถ€๋ชจ ํ•จ์ˆ˜์—์„œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€๋กœ ๋ฆฌํ„ด. (ํด๋กœ์ €)



ยท ์•ฝ 4๋ถ„

์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ#

์˜ค๋Š˜์€ ์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ 6์žฅ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณต๋ถ€ํ•˜์˜€๋‹ค.

6.1 ํด๋ž˜์Šค, ์ƒ์„ฑ์ž, ๋ฉ”์†Œ๋“œ๊นŒ์ง€๋Š” ๊ทธ๋Ÿญ์ €๋Ÿญ ์ดํ•ด๊ฐ€ ๋˜์—ˆ์œผ๋‚˜, 6.2 ์ƒ์† ๋ถ€๋ถ„์—์„œ ์ •๋ง ์˜คํ›„, ์ €๋… ์‹œ๊ฐ„ ๋‚ด๋‚ด ์ฉ”์ฉ” ๋งค๋ฉด์„œ ์ฝ์—ˆ์ง€๋งŒ ๋„์ €ํžˆ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค.

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

์ผ๋‹จ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ์ ์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.


์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฑ…์— ๋”ฐ๋ฅด๋ฉด ECMAScript 5์—์„œ ์ œ๊ณตํ•˜๋Š” Object.create() ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ์ด๋Ÿฌํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

function create_object(o) {    function F() {}    F.prototype = o;    return new F();}

์ด ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์†์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

var Person = {    name: 'zzoon',    getName: function () {        return this.name;    },    setName: function (arg) {        this.name = arg;    },};
function create_object(o) {    function F() {}    F.prototype = o;    return new F();}
var student = create_object(person);
student.setName('me');console.log(student.getName()); // me

2020-03-09-200309-image-0


์ด ๊ทธ๋ฆผ๊นŒ์ง€๋Š” ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค.


var Parent = (function () {    function Parent(name) {        this.name = name;    }
    Parent.prototype.sayHi = function () {        console.log('Hi! ' + this.name);    };
    return Parent;})();
var child = Object.create(Parent.prototype);child.name = 'child';
child.sayHi(); // Hi! child
console.log(child instanceof Parent); // true

์˜ˆ์ œ ์ถœ์ฒ˜ : ๐Ÿ”— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - Poiemaweb


์˜๋ฌธ์  : ์œ„ ์˜ˆ์ œ๋Š” ๋ถ€๋ชจ๊ฐ€ ๋˜๋Š” Person ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋„ฃ์€ ๋ฐ˜๋ฉด, ์ด ์˜ˆ์ œ์—์„œ๋Š” Parent.prototype ์„ Object.create ์˜ ์ธ์ˆ˜๋กœ ๋„ฃ์—ˆ๋Š”๊ฐ€?


2020-03-09-200309-image-1


์•—.. ์•„๋ž˜๋Š” ๋ถ€๋ชจ๋กœ ์‚ผ์„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—, ์œ„๋Š” ๋ถ€๋ชจ๋กœ ์‚ผ์„ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ธ ๊ฒƒ์ด์—ˆ๋‹ค..!


์ดํ•ด ์•ˆ๋˜๋Š” ์ ๋“ค

  • extend() ํ•จ์ˆ˜

  • apply() ํ•จ์ˆ˜ (๋Œ€๋žต์€ ์ดํ•ด๋จ ..;;)

  • ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ์ƒ์†์ธ ๊ฒฝ์šฐ ์™œ ์ž์‹ ํด๋ž˜์Šค์˜ prototype ์ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ, ์ด ๊ตฌ์กฐ๊ฐ€ ์™œ ์ž์‹ ํด๋ž˜์Šค์˜ prototype ์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฐ€?


2020-03-09-200309-image-2


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


ยท ์•ฝ 3๋ถ„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ#

  • ๋ณ€์ˆ˜ ํ‚ค์›Œ๋“œ var ์ƒ๋žต ๊ฐ€๋Šฅ?

๋ฏธ๋””์–ดํ”„๋กœ์ ํŠธ#

์ž๋ฃŒ ์กฐ์‚ฌ#

  - Tmap + ๋ธ”๋ž™๋ฐ•์Šค ์—ฐ๋™
     - ์˜์ƒ ๋ฐ์ดํ„ฐ์— ์‹œ๊ฐ„ ์ •๋ณด๋Š” ์ž˜ ๋‹ด๊น€
     - `mdls [ํŒŒ์ผ๋ช…]` (๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณด๋Š” ๋ช…๋ น์–ด)
     - (๋ฒˆ์™ธ) Tmap ๋ธ”๋ž™๋ฐ•์Šค๋Š” ์˜์ƒ์— ๋‚ ์งœ ์‹œ๊ฐ„์ด ํ‘œ์‹œ ์•ˆ๋จ โ†’ ์‚ฌ๊ณ ์‹œ ๋ฒ•์  ํšจ๋ ฅ X
  - Tmap API ๊ณต๋ถ€ - ๐Ÿ”— [http://tmapapi.sktelecom.com/main.html](http://tmapapi.sktelecom.com/main.html)
  > ์›นํŽ˜์ด์ง€ ๋ณด๊ธฐ๊ฐ€ ๋ถˆํŽธํ•˜๋‹ˆ ์•„๋ž˜ ์ฝ”๋“œ๋กœ ์ˆ˜์ •
  ```html  <div id="side_wrap" class="ui-resizable" style="height: 768px; width: 0px;">  ```


  ![2020-03-09-200310-image-0](./images/2020-03-09-200310-image-0.png)
  <br />

ํ•„์š”ํ•œ ๊ธฐ์ˆ #

Tmap๊ณผ ์—ฐ๋™ํ•œ ์šด์ „ ์Šต๊ด€ ๊ฐœ์„  ํ™•์žฅ ์•ฑ#

  1. pwa๋ฅผ ๋งŒ๋“ค๊ณ  ์˜์ƒ ์ดฌ์˜๊ณผ GPS ๋กœ๊ทธ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง„ํ–‰ํ•˜๊ณ  Tmap์„ ์‹คํ–‰ํ•ด์„œ๊ฒฝ๋กœ๋ฅผ ์•ˆ๋‚ดํ•จ Tmap์—์„œ ์šดํ–‰ ์ข…๋ฃŒ๋ฅผ ํ•˜๋ฉด ์˜์ƒ ์ดฌ์˜, ๊ธฐ๋ก์„ ๋ฉˆ์ถค. GPS๋กœ๊ทธ์™€ ์˜์ƒ์„ ๋‹ด์•„ ์„œ๋ฒ„๋กœ ์ „์†กํ•จ.

    PWA์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์‹ฑ์ด ์•ˆ๋˜๋Š” ํ•œ๊ณ„

  2. pwa๋ฅผ ๋งŒ๋“ค๊ณ  ๋ชฉ์ ์ง€๋ฅผ ์ž…๋ ฅ ํ›„ Tmap ์‹คํ–‰ (Tmap์€ ๋ธ”๋ž™๋ฐ•์Šค ์‚ฌ์šฉ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ์ƒํƒœ) Tmap ์™„๋ฃŒ ํ›„ gps + ์˜์ƒ ์ถ”์ถœ.

    Tmap ์ฃผํ–‰ ํ›„ GPS ์ถ”์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์œผ๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ PWA์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์‹ฑ์ด ์•ˆ๋˜์„œ GPS ๋ฐ์ดํ„ฐ ๋งŒ๋“œ๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•  ๋“ฏ

  3. ์•ฑ์„ ๋งŒ๋“ค๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์˜์ƒ ์ดฌ์˜, GPS ํŠธ๋ž™ํ•˜๋ฉด์„œ (๋ธ”๋ž™๋ฐ•์Šค ์—ญํ• ) Tmap์œผ๋กœ๊ฒฝ๋กœ ์•ˆ๋‚ด.

    ์‚ฌ์‹ค์ƒ ๋ธ”๋ž™๋ฐ•์Šค ์•ฑ?

    ๋‹ค๋ฅธ ์•ฑ๋“ค

์•ฑ ๋งŒ๋“ค๊ธฐ#

  • ionic

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

  • React-Native

    ์ž๋ฃŒ๊ฐ€ ์กฐ๊ธˆ ๋” ๋งŽ์€ ํŽธ์ธ๋“ฏ

์–ด๋–ค ๊ฒƒ์œผ๋กœ ํ•ด์•ผํ•  ์ง€๋Š” ์กฐ๊ธˆ ๋” ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค.

๊ทธ์™ธ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ํ”„๋กœ์ ํŠธ๋“ค#

  • ์›นํŽ˜์ด์ง€ ๋ชจ๋“  ์†Œ์Šค ๋‹ค์šด๋กœ๋“œ ํˆด

  • ์ฝ๊ธฐ๋ชจ๋“œ ์ต์Šคํ…์…˜ (chrome)



ยท ์•ฝ 7๋ถ„

์ด ๊ธ€์€ ๊ณ ํ˜„์ค€, ์†กํ˜•์ฃผ ๋‹˜์˜ ์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

JavaScript ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ์ž (๊ณ„์†)#

์ฐธ์กฐ ํƒ€์ž…(๊ฐ์ฒด ํƒ€์ž…)#

for in ๋ฌธ๊ณผ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ถœ๋ ฅ#

for in ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ์ฒด์— ํฌํ•จ๋œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๋ฃจํ”„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค .

// ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ†ตํ•œ foo ๊ฐ์ฒด ์ƒ์„ฑvar foo = {    name: 'foo',    age: 30,    major: 'computer science',};
// for in ๋ฌธ์„ ์ด์šฉํ•œ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ถœ๋ ฅfor (var prop in foo) {    console.log(prop, foo[prop]);}

[์ถœ๋ ฅ ๊ฒฐ๊ณผ]

name fooage 30major computer science

for in ๋ฌธ์ด ์ˆ˜ํ–‰๋˜๋ฉด์„œ prop ๋ณ€์ˆ˜์— foo ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•˜๋‚˜์”ฉ ํ• ๋‹น๋˜๊ณ , prop ์— ํ• ๋‹น๋œ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ foo[prop] ์™€ ๊ฐ™์ด ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ#

JS ์—์„œ๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ delete ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์ฆ‰์‹œ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ delete ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ญ์ œํ•  ๋ฟ, ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜์ง€๋Š” ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

// ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ†ตํ•œ foo ๊ฐ์ฒด ์ƒ์„ฑvar foo = {    name: 'foo',    nickname: 'babo',};
console.log(foo.nickname); // (์ถœ๋ ฅ๊ฐ’) babodelete foo.nickname; // (์ถœ๋ ฅ๊ฐ’) nickname ํ”„๋กœํผํ‹ฐ ์‚ญ์ œconsole.log(foo.nickname); // (์ถœ๋ ฅ๊ฐ’) undefined
delete foo; // (์ถœ๋ ฅ๊ฐ’) foo ๊ฐ์ฒด ์‚ญ์ œ ์‹œ๋„console.log(foo.name); // (์ถœ๋ ฅ๊ฐ’) foo

์ฐธ์กฐ ํƒ€์ž…์˜ ํŠน์„ฑ#

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์ธ ์ˆซ์ž, ๋ฌธ์ž์—ด, boolean, null, undefined 5๊ฐ€์ง€๋ฅผ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฐ’์€ ๊ฐ์ฒด๋‹ค. ๋ฐฐ์—ด์ด๋‚˜ ํ•จ์ˆ˜ ๋˜ํ•œ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋Š”์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฐธ์กฐ ํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ฐ์ฒด์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์ด ์‹ค์ œ ๊ฐ’์ด ์•„๋‹Œ ์ฐธ์กฐ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

var objA = {    value: 40,};var objB = objA;
console.log(objA.value); // 40console.log(objB.value); // 40
objB.value = 50;
console.log(objA.value); // 50console.log(objB.value); // 50
var a = 40;var b = a;
console.log(a);console.log(b);
b = 50;
console.log(a);console.log(b);

objA ๋Š” ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๊ฐ’์„์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

objB ์— objA ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์ฐธ์กฐ๊ฐ’์ด objB ์— ์ „๋‹ฌ๋˜๊ณ , objB ์™€ objA ๊ฐ€๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜์–ด objB.value ์˜ ๊ฐ’์„ 50์œผ๋กœ ๊ฐฑ์‹ ํ•˜์ž objA.value ์˜๊ฐ’๋„ 50์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.

๋ฐ˜๋ฉด ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ธฐ๋ณธ ํƒ€์ž…์ธ a , b ์˜ ๊ฒฝ์šฐ๋Š” b ์— a ๋ฅผ ํ• ๋‹นํ•  ๋•Œ, ์ฐธ์กฐ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐ’์ด ๋ณต์‚ฌ๋œ๋‹ค. ๋”ฐ๋ผ์„œ b ๋ฅผ 50์œผ๋กœ ๊ฐฑ์‹ ํ•ด๋„ a ์˜ ๊ฐ’์€ 40์œผ๋กœ ์œ ์ง€๋œ๋‹ค.


Call by value vs Call by reference


๊ฐ์ฒด ๋น„๊ต ( == )#

๋™๋“ฑ ์—ฐ์‚ฐ์ž( == )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ๋„ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ’์ด ์•„๋‹Œ ์ฐธ์กฐ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

var objA = {    value: 100,};
var objB = {    value: 100,};
var objC = objB;
console.log(objA.value == objB.value); // trueconsole.log(objA == objB); // falseconsole.log(objB == objC); // true

objA.value ์™€ objB.value ๋ฅผ ๋™๋“ฑ ์—ฐ์‚ฐ์ž( == )๋กœ ๋น„๊ตํ•˜๋ฉด, true ๊ฐ€ ๋˜๋Š”๋ฐ์ด ๋‘˜์€ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ๊ฐ’ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜๋ฉด objA ์™€ objB ๋Š” ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์˜ ์ฐธ์กฐ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— false ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

objC ๋Š” objB ์˜ ์ฐธ์กฐ๊ฐ’์„ ๋ณต์‚ฌํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์—, true ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.


ํ‘œ์ค€ ๋™์น˜ ( == ) vs ์—„๊ฒฉ ๋™์น˜ ( === )

== : ๋‘ ํ”ผ์—ฐ์‚ฐ์ž์˜ ์ž๋ฃŒํ˜•์ด ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ™์•„์ง€๋„๋ก ๋ณ€ํ™˜ํ•œ ํ›„, ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋ชจ๋‘ ๊ฐ์ฒด๋ผ๋ฉด ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•œ๋‹ค. - ์ˆซ์ž์™€ ๋ฌธ์ž์—ด ๋น„๊ต์‹œ์—” ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Number *์ž๋ฃŒํ˜• ๊ฐ’์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•œ๋‹ค.

  • ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ž๊ฐ€* Boolean ์ธ ๊ฒฝ์šฐ true ๋Š” 1, false ๋Š” 0์œผ๋กœ๋ณ€ํ™˜ํ•œ๋‹ค. - ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž์™€ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ, ์—ฐ์‚ฐ์ž๋Š” ์šฐ์„  ๊ฐ์ฒด์˜ valueOf() ๋˜๋Š” toString() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด ํ˜น์€ ์ˆซ์ž ๊ฐ’์„ ๋ฐ›์œผ๋ ค ์‹œ๋„ํ•œ๋‹ค.

=== : ์ž๋ฃŒํ˜• ๋ณ€ํ™˜ ์—†์ด ๋‘ ์—ฐ์‚ฐ์ž๊ฐ€ ์—„๊ฒฉํžˆ ๊ฐ™์€์ง€ ํŒ๋ณ„ํ•œ๋‹ค. ๋ชจ๋‘ ๊ฐ์ฒด๋ผ๋ฉด ์ฐธ์กฐ๊ฐ’ ๋น„๊ตํ•œ๋‹ค.

- ๐Ÿ”— MDN web docs - ๋น„๊ต ์—ฐ์‚ฐ์ž ์—์„œ


์ฐธ์กฐ์— ์˜ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹#

๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฒฝ์šฐ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹๋„ ๋‹ค๋ฅด๋‹ค.

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

์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ ๋ฐฉ์‹์œผ๋กœ ์ธ์ž๋กœ ์ฐธ์กฐ ํƒ€์ž…์ธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ• ๊ฒฝ์šฐ, ์ธ์ž๋กœ ๋„˜๊ธด ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐ๊ฐ’์„ ์ด์šฉํ•ด์„œ ์‹ค์ œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

var a = 10;var objA = {    value: 10,};
function changeArg(num, obj) {    num = 20;    obj.value = 20;
    console.log(num); // 20    console.log(obj.value); // 20}
changeArg(a, objA);
console.log(a); // 10 (๋ฐ”๋€Œ์ง€ ์•Š์Œ)console.log(objA.value); // 20 (๋ฐ”๋€œ)

ยท ์•ฝ 15๋ถ„

์ด ๊ธ€์€ ๊ณ ํ˜„์ค€, ์†กํ˜•์ฃผ ๋‹˜์˜ ์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž…#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. (๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ƒ์† ๊ฐœ๋…๊ณผ ๋น„์Šท)

๋ถ€๋ชจ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ž์‹ ์˜ ๊ฒƒ์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

var foo = {    name: 'foo',    age: 30,};
console.log(foo.toString());console.dir(foo);

[์ถœ๋ ฅ ๊ฒฐ๊ณผ]

2020-03-02-200303-image-0

์ƒ์„ฑํ•œ foo ๊ฐ์ฒด์—๋Š” toString() ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์Œ์—๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋ฐ, ์ด๋Š” foo ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์— toString() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๋Š” [[Prototype]] ๋ผ๋Š” ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” __proto__ ๊ฐ€ ์ˆจ๊ฒจ์ง„ [[Prototype]] ํ”„๋กœํผํ‹ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์šฐ์„ ์€ Object.prototype ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ๋งŒ๊ธฐ์–ตํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž.

๋˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ฒฐ์ •๋œ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์ž„์˜์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋„๊ฐ€๋Šฅํ•˜๋‹ค.

(์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ƒ์† ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.)


๋ฐฐ์—ด#

๋ฐฐ์—ด์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์˜ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์ด๋‹ค.

C๋‚˜ Java์˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฐ์ฒด์ง€๋งŒ ํฌ๊ธฐ๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ , ์–ด๋–ค ์œ„์น˜์— ์–ด๋Š ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋”๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ex) var arr = [ 1, '2', true, 1.1, '์•ˆ๋…•ํ•˜์„ธ์š”', [1, 2, 3, 4]];


๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด#

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ด ์ค‘๊ด„ํ˜ธ {} ๋ฅผ ์ด์šฉํ•œ ํ‘œ๊ธฐ๋ฒ•์ด์—ˆ๋‹ค๋ฉด, ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ๋Œ€๊ด„ํ˜ธ [] ๋ฅผ์ด์šฉํ•œ๋‹ค.

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์€ key: value ์Œ์œผ๋กœ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„๊ณผ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋ชจ๋‘ ํ‘œ๊ธฐํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋ฐฐ์—ด์€ ๊ฐ ์š”์†Œ์˜ ๊ฐ’๋งŒ์„ ํฌํ•จํ•œ๋‹ค.

๊ฐ์ฒด๊ฐ€ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์œผ๋กœ ๋Œ€๊ด„ํ˜ธ๋‚˜ ๋งˆ์นจํ‘œ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ–ˆ๋‹ค๋ฉด, ๋ฐฐ์—ด์€ ๋Œ€๊ด„ํ˜ธ ๋‚ด์— ์ธ๋ฑ์Šค ๊ฐ’์„ ๋„ฃ์–ด์„œ ์ ‘๊ทผํ•œ๋‹ค.


๋ฐฐ์—ด์˜ ์š”์†Œ ์ƒ์„ฑ#

๊ฐ์ฒด๊ฐ€ ๋™์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ๋ฐฐ์—ด๋„ ๋™์ ์œผ๋กœ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ๋Š” ๊ฐ’์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋„ฃ์„ ํ•„์š” ์—†์ด ์•„๋ฌด ์ธ๋ฑ์Šค ์œ„์น˜์—๋‚˜ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

var emptyArr = [];console.log(emptyArr[0]);
emptyArr[0] = 100;emptyArr[3] = 'eight';emptyArr[7] = true;console.log(emptyArr);console.log(emptyArr.length);

๋ฐฐ์—ด์˜ length ํ”„๋กœํผํ‹ฐ#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๋ฐฐ์—ด์€ length ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค.

length ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ํฐ ์ธ๋ฑ์Šค์— 1์„ ๋”ํ•œ ๊ฐ’์ด๋‹ค. (์›์†Œ ๊ฐœ์ˆ˜์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜)

var arr = [];console.log(arr.length); // 0
arr[0] = 0;arr[1] = 1;arr[2] = 2;arr[100] = 100;console.log(arr.length); // 101

arr ์˜ ์›์†Œ ๊ฐœ์ˆ˜๊ฐ€ 4๊ฐœ ๋ฟ์ด์ง€๋งŒ, arr.length ์˜ ๊ฐ’์€ 101์ž„.


๋ฐฐ์—ด์˜ length ํ”„๋กœํผํ‹ฐ๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

var arr = [0, 1, 2];console.log(arr.length); // 3
arr.length = 5;console.log(arr); // [0, 1, 2, undefined, undefined]
arr.length = 2;console.log(arr); // [0, 1]console.log(arr[2]); // undefined

arr.length ๋ฅผ ๊ธฐ์กด length ๋ณด๋‹ค ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด ์›์†Œ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์•˜๋˜ ์ธ๋ฑ์Šค๋Š” undefined ๋กœ ์ถœ๋ ฅ๋˜๊ณ , ๋˜ํ•œ ๊ธฐ์กด length ๋ณด๋‹ค ์ž‘๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด ํ• ๋‹น๋˜์—ˆ๋˜ ์ธ๋ฑ์Šค๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.


๋ฐฐ์—ด ํ‘œ์ค€ ๋ฉ”์†Œ๋“œ์™€ length ํ”„๋กœํผํ‹ฐ#

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

  • push() ๋ฉ”์†Œ๋“œ : ๋ฐฐ์—ด์˜ ํ˜„์žฌ length ๊ฐ’์˜ ์œ„์น˜์— ์ƒˆ๋กœ์šด ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

arr.length ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณ€๊ฒฝํ•œ ์œ„์น˜ ๋’ค์— push() ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.


๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋ฐฐ์—ด ์—ญ์‹œ ๊ฐ์ฒด์ธ๋ฐ, ๋ฐฐ์—ด์€ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ์•ฝ๊ฐ„ ์ฐจ์ด๊ฐ€ ์žˆ๋”ฐ.

// colorsArray ๋ฐฐ์—ดvar colorsArray = ['orange', 'yellow', 'green'];console.log(colorsArray[0]); // orangeconsole.log(colorsArray[1]); // yellowconsole.log(colorsArray[2]); // green
// colorsObj ๊ฐ์ฒดvar colorsObj = {    0: 'orange',    1: 'yellow',    2: 'green',};console.log(colorsObj[0]); // orangeconsole.log(colorsObj[1]); // yellowconsole.log(colorsObj[2]); // green
// typeof ์—ฐ์‚ฐ์ž ๋น„๊ตconsole.log(typeof colorsArray); // objectconsole.log(typeof colorsObj); // object
// length ํ”„๋กœํผํ‹ฐconsole.log(colorsArray.length); // 3console.log(colorsObj.length); // undefined
// ๋ฐฐ์—ด ํ‘œ์ค€ ๋ฉ”์†Œ๋“œcolorsArray.push('red');console.log(colorsArray); // ['orange', 'yellow', 'green', 'red']colorsObj.push('red'); // Uncaught TypeError: Object #<Object> has no method 'push'
  • ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋Š” ์œ ์‚ฌํ•˜๊ฒŒ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฒฐ๊ณผ๊ฐ’ ์ถœ๋ ฅ๊ณผ ํ”„๋กœํผํ‹ฐ์ ‘๊ทผ ๋ชจ๋‘ ๋น„์Šทํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ์—์„œ ํ”„๋กœํผํ‹ฐ ์†์„ฑ์„ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด [] ๋‚ด๋ถ€์— ์ˆซ์ž๊ฐ€ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, ์ˆซ์ž๋ฅผ ์ž๋™์œผ๋กœ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ๋ฐ”๊พธ์–ด์ฃผ์–ด ์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • typeof ์—ฐ์‚ฐ์ž ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ object ์ด๋‹ค.

  • ๊ฐ์ฒด์—๋Š” length ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋‹ค. ( undefined )

  • ๊ฐ์ฒด์—์„œ๋Š” ๋ฐฐ์—ด ํ‘œ์ค€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด ํ‘œ์ค€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” Object.prototype ๊ฐ์ฒด๊ฐ€ ํ”„๋กœํ† ํƒ€์ž…์ธ ๋ฐ˜๋ฉด ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ Array.prototype ๊ฐ์ฒด๊ฐ€ ํ”„๋กœํ† ํƒ€์ž…์ด๋‹ค. ๋˜ํ•œ Array.prototype ์˜ ํ”„๋กœํ† ํƒ€์ž…์€ Object.prototype ๊ฐ์ฒด์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์€ Array.prototype ์— ํฌํ•จ๋œ ๋ฐฐ์—ด ํ‘œ์ค€ ๋ฉ”์†Œ๋“œ์™€ Object.prototype ์˜ ๊ฐ์ฒด ํ‘œ์ค€๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๋ฐฐ์—ด์˜ ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑ#

๋ฐฐ์—ด๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ, ์ธ๋ฑ์Šค๊ฐ€ ์ˆซ์ž์ธ ๋ฐฐ์—ด ์›์†Œ ์ด์™ธ์—๋„ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋™์ ์œผ๋กœํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋ฐฐ์—ด ์ƒ์„ฑvar arr = ['zero', 'one', 'two'];console.log(arr.length); // 3
// ํ”„๋กœํผํ‹ฐ ๋™์  ์ถ”๊ฐ€arr.color = 'blue';arr.name = 'number_array';console.log(arr.length); // 3
// ๋ฐฐ์—ด ์›์†Œ ์ถ”๊ฐ€arr[3] = 'red';console.log(arr.length); // 4
// ๋ฐฐ์—ด ๊ฐ์ฒด ์ถœ๋ ฅconsole.dir(arr);

[ console.dir(arr) ์ถœ๋ ฅ ๊ฒฐ๊ณผ]

2020-03-02-200303-image-1

๋ฐฐ์—ด๋„ ๊ฐ์ฒด์ฒ˜๋Ÿผ key: value ํ˜•ํƒœ๋กœ ๋ฐฐ์—ด ์›์†Œ ๋ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.


๋ฐฐ์—ด์˜ ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ#

๊ฐ์ฒด๋Š” for in ๋ฌธ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์—ด๊ฑฐํ•˜๋Š”๋ฐ, ๋ฐฐ์—ด๋„ ๊ฐ์ฒด์ด๋ฏ€๋กœ for in ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ถˆํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ for ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

for of ๋ฌธ for in ์€ ๊ฐ์ฒด์˜ ๋ชจ๋“  ์—ด๊ฑฐ๊ฐ€๋Šฅํ•œ ์†์„ฑ์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ˜๋ฉด, for of ๋ฌธ์€ ์ปฌ๋ ‰์…˜ ์ „์šฉ์œผ๋กœ [Symbol.iterator] ์†์„ฑ์ด ์žˆ๋Š” ์ปฌ๋ ‰์…˜ ์š”์†Œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค.

const iterable = [10, 20, 30];
for (const value of iterable) {    console.log(value);}// 10// 20// 30

โ˜ ์˜๋ฌธ : ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ let , const ์ฐจ์ด - ๐Ÿ”— [javascript] ES6 ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผํ•  ๋ฌธ๋ฒ• let, const ์ฐจ์ด์ 

๊ธฐ๋ณธ ๋ณ€์ˆ˜์ผ ๋•Œ

  • let : ๋ณ€์ˆ˜

  • const : ์ƒ์ˆ˜

์ฐธ์กฐ ๋ณ€์ˆ˜์ผ ๋•Œ

  • let : ์ฐธ์กฐ๊ฐ’์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ์Œ. (๋‹ค๋ฅธ ๊ฐ์ฒด ์ง€์ • ๊ฐ€๋Šฅ)

  • const : ์ฐธ์กฐ๊ฐ’์ด ๋ณ€ํ•  ์ˆ˜ ์—†์Œ. (๋‚ด๋ถ€ ์†์„ฑ์€ ๋ณ€ํ™” ๊ฐ€๋Šฅ)

const objA = {};let objB = {};
objA = objB; // Error: "objA" is read-onlyobjB = objA;

๋ฐฐ์—ด ์š”์†Œ ์‚ญ์ œ#

๋ฐฐ์—ด๋„ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ฐฐ์—ด ์š”์†Œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐ delete ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋‹ค.

var arr = ['zero', 'one', 'two', 'three'];delete arr[2];console.log(arr); // ['zero', 'one', undefined, 'three']console.log(arr.length); // 4

delete arr[2] ๋กœ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด, arr[2] ์— undefined ๊ฐ€ ํ• ๋‹น๋˜๊ฒŒ๋˜์ง€๋งŒ, ๋ฐฐ์—ด์˜ length ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ์›์†Œ ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋•Œ๋ฌธ์— ๋ฐฐ์—ด์—์„œ ์š”์†Œ๋ฅผ ์™„์ „ํžˆ ์‚ญ์ œํ•  ๊ฒฝ์šฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” splice() ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


splice() ํ•จ์ˆ˜#

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

๋งค๊ฐœ๋ณ€์ˆ˜

  • start : ๋ฐฐ์—ด์˜ ๋ณ€๊ฒฝ์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค, ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ณด๋‹ค ํฐ ๊ฐ’์ด๋ผ๋ฉด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋กœ ์„ค์ •๋จ. ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ๋์—์„œ๋ถ€ํ„ฐ ์„ธ์–ด๊ฐ€๊ณ , ์ ˆ๋Œ€๊ฐ’์ด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ณด๋‹ค ํฐ๊ฒฝ์šฐ 0์œผ๋กœ ์„ค์ •๋จ

  • deleteCount [์˜ต์…”๋„] : ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐํ•  ์š”์†Œ์˜ ์ˆ˜. 0์ด๋ฉด ์–ด๋–ค ์š”์†Œ๋„ ์ œ๊ฑฐํ•˜์ง€์•Š์Œ. (์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ)

  • item1, item2, ... [์˜ต์…”๋„] : ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•  ์š”์†Œ. ์—†์œผ๋ฉด splice() ๋Š” ์š”์†Œ๋ฅผ์ œ๊ฑฐํ•˜๊ธฐ๋งŒ ํ•œ๋‹ค.

๋ฐ˜ํ™˜ ๊ฐ’

  • ์ œ๊ฑฐํ•œ ์š”์†Œ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด, ํ•˜๋‚˜๋งŒ ์ œ๊ฑฐํ•œ ๊ฒฝ์šฐ ๊ธธ์ด๊ฐ€ 1์ธ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ ์•„๋ฌด ๊ฒƒ๋„์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด.

Array() ์ƒ์„ฑ์ž ํ•จ์ˆ˜#

์ผ๋ฐ˜์ ์ธ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๊ฒฐ๊ตญ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•œ ๊ฒƒ์ด๋‹ค.

Array() ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ new ์—ฐ์‚ฐ์ž๋ฅผ ์จ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ž.

Array() ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ค๋ฅด๋‹ค.

  • ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž๊ฐ€ ์ˆซ์ž 1๊ฐœ ์ผ ๊ฒฝ์šฐ : ํ˜ธ์ถœ๋œ ์ธ์ž๋ฅผ length ๋กœ ๊ฐ–๋Š” ๋นˆ ๋ฐฐ์—ด ์ƒ์„ฑ

  • ๊ทธ ์™ธ : ํ˜ธ์ถœ๋œ ์ธ์ž๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด ์ƒ์„ฑ

var foo = new Array(3);console.log(foo); // [undefined, undefined, undefined]console.log(foo.length); // 3
var bar = new Array(1, 2, 3);console.log(bar); // [1, 2, 3]console.log(bar.length); // 3

์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด#

๋งŒ์•ฝ ์ผ๋ฐ˜ ๊ฐ์ฒด์— length ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? - ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด(array-like object) ๋ผ๊ณ  ํ•œ๋‹ค.

์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ‘œ์ค€ ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ( apply() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค)

var arr = ['bar'];var obj = {    name: 'foo',    length: 1,};
arr.push('baz');console.log(arr); // ['bar', 'baz']
Array.prototype.push.apply(obj, ['baz']);console.log(obj); // { '1': 'baz', name: 'foo', length: 2}

arguments ๊ฐ์ฒด๋‚˜ jQuery ๊ฐ์ฒด๊ฐ€ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๋‹ค.


๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ํ‘œ์ค€ ๋ฉ”์„œ๋“œ#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ˆซ์ž, ๋ฌธ์ž์—ด, Boolean ์— ๋Œ€ํ•ด ๊ฐ ํƒ€์ž…๋ณ„๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํ‘œ์ค€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฒฝ์šฐ๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ๋ฐ ์–ด๋–ป๊ฒŒ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๊ธฐ๋ณธ๊ฐ’์€ ๋ฉ”์†Œ๋“œ ์ฒ˜๋ฆฌ ์ˆœ๊ฐ„์— ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋œ ๋‹ค์Œ ํƒ€์ž…๋ณ„ ํ‘œ์ค€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋๋‚˜๋ฉด ๋‹ค์‹œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ณต๊ท€ํ•œ๋‹ค.

var num = 0.5;console.log(num.toExponential(1)); // 5.0e-1
console.log('test'.charAt(2)); // s

์—ฐ์‚ฐ์ž#

+ ์—ฐ์‚ฐ์ž#

๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ๊ณผ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์—ฐ์‚ฐ

typeof ์—ฐ์‚ฐ์ž#

ํ”ผ์—ฐ์‚ฐ์ž์˜ ํƒ€์ž…์„ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด.

TypeNametypeof ๊ฒฐ๊ณผ
๊ธฐ๋ณธ ํƒ€์ž…์ˆซ์ž'number'
๊ธฐ๋ณธ ํƒ€์ž…๋ฌธ์ž์—ด'string'
๊ธฐ๋ณธ ํƒ€์ž…Boolean'boolean'
๊ธฐ๋ณธ ํƒ€์ž…null'object'
๊ธฐ๋ณธ ํƒ€์ž…undefined'undefined'
์ฐธ์กฐ ํƒ€์ž…๊ฐ์ฒด'object'
์ฐธ์กฐ ํƒ€์ž…๋ฐฐ์—ด'object'
์ฐธ์กฐ ํƒ€์ž…ํ•จ์ˆ˜'function'

โ˜ null ๊ณผ ๋ฐฐ์—ด์ด 'object' ๋ผ๋Š” ์ . ํ•จ์ˆ˜๋Š” 'function' ์ด๋ผ๋Š” ์ ์— ์œ ์˜


๋™๋“ฑ ์—ฐ์‚ฐ์ž( == )์™€ ์ผ์น˜ ์—ฐ์‚ฐ์ž( === )#

๋™๋“ฑ ์—ฐ์‚ฐ์ž๋Š” ๋น„๊ตํ•˜๋ ค๋Š” ํ”ผ์—ฐ์‚ฐ์ž์˜ ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ์— ํƒ€์ž… ๋ณ€ํ™˜ ํ›„ ๋น„๊ต.

์ผ์น˜ ์—ฐ์‚ฐ์ž๋Š” ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋น„๊ต.

== ๋™๋“ฑ ์—ฐ์‚ฐ์ž๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ.


!! ์—ฐ์‚ฐ์ž#

!! ์—ฐ์‚ฐ์ž๋Š” ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ Boolean ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

console.log(!!0); // falseconsole.log(!!1); // trueconsole.log(!!''); // falseconsole.log(!!'string'); // trueconsole.log(!!false); // falseconsole.log(!!true); // trueconsole.log(!!null); // falseconsole.log(!!undefined); // falseconsole.log(!!{}); // trueconsole.log(!![]); // true

null ๊ณผ undefined ๋Š” false , ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์€ ๋ชจ๋‘ ๋น„์–ด์žˆ์–ด๋„ true

ยท ์•ฝ 10๋ถ„

์ธํ„ฐ๋„ท ๊ฐ•์ขŒ๋กœ๋Š” ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ์ ๋“ค์ด ๋งŽ์•„์„œ '์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ' ebook์„ ๊ตฌ์ž…ํ•ด ๊ณต๋ถ€ํ•œ๋‹ค.

์ด ๊ธ€์€ ๊ณ ํ˜„์ค€, ์†กํ˜•์ฃผ ๋‹˜์˜ ์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

JavaScript ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ์ž#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ’๋“ค์€ ํฌ๊ฒŒ ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž…์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…

    • ์ˆซ์ž

    • ๋ฌธ์ž์—ด

    • boolean

    • null

    • undefined

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

    • ๊ฐ์ฒด

      • ๋ฐฐ์—ด

      • ํ•จ์ˆ˜

      • ์ •๊ทœํ‘œํ˜„์‹

๋ฐฐ์—ด, ํ•จ์ˆ˜, ์ •๊ทœํ‘œํ˜„์‹์ด ๋ชจ๋‘ ๊ฐ์ฒด์— ์†ํ•˜๋Š” ๊ฐœ๋….


๊ธฐ๋ณธ ํƒ€์ž…#

๊ธฐ๋ณธ ํƒ€์ž…์˜ ํŠน์ง•์€ ๊ทธ ์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋Š” ๊ฒƒ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋Š์Šจํ•œ ํƒ€์ž… ์ฒดํฌ ์–ธ์–ด๋‹ค. C๋‚˜ Java ๋“ฑ์˜ ์—„๊ฒฉํ•œ ํƒ€์ž… ์ฒดํฌ ์–ธ์–ด๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ char, int, float ๋“ฑ์˜ ์˜ˆ์•ฝ์–ด๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค.

๋ฐ˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ •ํ•˜์ง€ ์•Š๊ณ  var (let, const) ๋ผ๋Š” ํ•œ ๊ฐ€์ง€ ํ‚ค์›Œ๋“œ๋กœ๋งŒ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

var intNum = 10;var floatNum = 0.1;
var singleQuoteStr = 'Single quote string';var doubleQuoteStr = 'Double quote string';var singleChar = 'a';
var boolVar = true;
var emptyVar;
var nullVar = null;
console.log(    typeof intNum, // number    typeof floatNum, // number    typeof singleQuoteStr, // string    typeof doubleQuoteStr, // string    typeof boolVar, // boolean    typeof emptyVar, // undefined    typeof nullVar, //object);

์ˆซ์ž#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋ชจ๋“  ์ˆซ์ž๋ฅผ 64๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์  ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.

intNum๊ณผ floatNum ๋ณ€์ˆ˜ ๋ชจ๋‘ typeof ์—ฐ์‚ฐ์ž์˜ ๊ฒฐ๊ณผ๊ฐ’์ด number ํƒ€์ž…์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ •์ˆ˜ํ˜•์ด ๋”ฐ๋กœ ์—†๊ณ  ๋ชจ๋“  ์ˆซ์ž๋ฅผ ์‹ค์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ 5/2 ์˜๊ฒฝ์šฐ 2๊ฐ€ ์•„๋‹ˆ๋ผ 2.5๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

var num = 5 / 2;
console.log(num); // 2.5console.log(Math.floor(num)); // 2

๋ฌธ์ž์—ด#

๋ฌธ์ž์—ด์€ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋‚˜ ํฐ ๋”ฐ์˜ดํ‘œ๋กœ ์ƒ์„ฑํ•œ๋‹ค. typeof์˜ ๊ฒฐ๊ณผ๋Š” string์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” C์–ธ์–ด์˜ char ํƒ€์ž…๊ณผ ๊ฐ™์ด ๋ฌธ์ž ํ•˜๋‚˜๋งŒ์„ ๋ณ„๋„๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ํ•œ ๋ฒˆ ์ •์˜๋œ ๋ฌธ์ž์—ด์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (immutable)


๋ถˆ๋ฆฐ๊ฐ’#

true, false๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฐ ํƒ€์ž…์ด๋‹ค.


null๊ณผ undefined#

์ด ๋‘ ํƒ€์ž…์€ ๋ชจ๋‘ '๊ฐ’์ด ๋น„์–ด์žˆ์Œ'์„ ๋œปํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ ๋‚ด์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” undefined ํƒ€์ž…์ด๋ฉฐ , undefined ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜ ์ž์ฒด์˜ ๊ฐ’ ๋˜ํ•œ undefined์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ undefined๋Š” ํƒ€์ž…์ด์ž, ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค

null ํƒ€์ž… ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์ด ๋น„์–ด์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค .

์ฃผ์˜ํ•  ์ ์€ null ํƒ€์ž… ๋ณ€์ˆ˜์˜ typeof ๊ฒฐ๊ณผ๊ฐ€ null์ด ์•„๋‹ˆ๋ผ object๋ผ๋Š” ๊ฒƒ์ด๊ณ ๋”ฐ๋ผ์„œ null ํƒ€์ž… ๋ณ€์ˆ˜์ธ์ง€ ํ™•์ธํ•  ๋•Œ typeof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๊ณ , ์ผ์น˜ ์—ฐ์‚ฐ์ž (===)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ง์ ‘ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

var nullVar = null;
console.log(typeof nullVar === null);console.log(nullVar === null);

์ฐธ์กฐ ํƒ€์ž…(๊ฐ์ฒด ํƒ€์ž…)#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ˆซ์ž, ๋ฌธ์ž์—ด, boolean, null, undefined ๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ œ์™ธํ•œ๋ชจ๋“  ๊ฐ’์€ ๊ฐ์ฒด๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐฐ์—ด, ํ•จ์ˆ˜, ์ •๊ทœํ‘œํ˜„์‹ ๋“ฑ๋„ ๋ชจ๋‘ ๊ฒฐ๊ตญ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋Š” ๋‹จ์ˆœํžˆ '์ด๋ฆ„(key):๊ฐ’(value)' ํ˜•ํƒœ์˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ์„œ, ์ปดํ“จํ„ฐ ๊ณผํ•™ ๋ถ„์•ผ์—์„œ ํ•ด์‹œ(hash)๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•˜๋‹ค.

๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฐ’์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ํ•จ์ˆ˜๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.


๊ฐ์ฒด ์ƒ์„ฑ#

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Object() ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด์šฉ
var foo = new Object();
foo.name = 'foo';foo.age = 30;foo.gender = 'male';
console.log(typeof foo); // objectconsole.log(foo); // { name: 'foo', age: 30, gender: 'male' }
  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹ ์ด์šฉ
var foo = {    name: 'foo',    age: 30,    gender: 'male',};
console.log(typeof foo); // objectconsole.log(foo); // { name: 'foo', age: 30, gender: 'male' }

์ค‘๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑ, {} ์•ˆ์— ์•„๋ฌด๊ฒƒ๋„ ์ ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด์šฉ

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ์— ๋‹ค๋ฃฌ๋‹ค.


๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ/๊ฐฑ์‹ #

๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  • ๋Œ€๊ด„ํ˜ธ ( [] ) ํ‘œ๊ธฐ๋ฒ•

  • ๋งˆ์นจํ‘œ ( . ) ํ‘œ๊ธฐ๋ฒ•

var foo = {    name: 'foo',    major: 'computer science',};
// ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ฝ๊ธฐconsole.log(foo.name); // fooconsole.log(foo['name']); // fooconsole.log(foo.nickname); // undefined
// ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ๊ฐฑ์‹ foo.major = 'electronics engineering';console.log(foo.major); // electronics engineering
foo['major'] = 'digital media';console.log(foo['major']); // digital media
// ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑfoo.age = 30;console.log(foo.age); // 30
foo['gender'] = 'male';console.log(foo['gender']); // male

๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์˜ ๊ฒฝ์šฐ ์ ‘๊ทผํ•˜๋ ค๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๋‹ค์Œ ๋Œ€๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์•ผ ๋œ๋‹ค.

๋งŒ์•ฝ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  foo[name] ๋กœ ์ ‘๊ทผํ•œ๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” name ์ด๋ผ๋Š” ๋ณ€์ˆ˜ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ toString() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋ ค๋Š” ์‹œ๋„๋ฅผ ํ•œ๋‹ค.


๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ• ๋งŒ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ ‘๊ทผํ•˜๋ ค๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ‘œํ˜„์‹์ด๊ฑฐ๋‚˜ ์˜ˆ์•ฝ์–ด์ผ ๊ฒฝ์šฐ, ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•๋งŒ์„ ์ด์šฉํ•ด์„œ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค. ex) foo['full-name']


๊ฐ์ฒด ์†์„ฑ ์ด๋ฆ„ ์ง“๊ธฐ#

์  ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์†์„ฑ์˜ ์ด๋ฆ„์ด ์‹๋ณ„์ž ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. ์‹๋ณ„์ž๊ทœ์น™์„ ๋”ฐ๋ฅผ ๊ฒฝ์šฐ ์†์„ฑ์˜ ์ด๋ฆ„์„ '' ๋กœ ๊ฐ์‹ธ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹๋ณ„์ž ์ฝ”๋“œ ๋‚ด์˜ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ์†์„ฑ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฌธ์ž์—ด๋Œ€์†Œ๋ฌธ์ž๋ฅผ๊ตฌ๋ณ„ํ•˜๋ฉฐ ์œ ๋‹ˆ์ฝ”๋“œ ๊ธ€์ž, $ , _ ,์ˆซ์ž(0-9)๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆซ์ž๋กœ ์‹œ์ž‘ํ• ์ˆ˜๋Š” ์—†๋‹ค.

๐Ÿ”—MDN web docs - ์‹๋ณ„์ž


๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ๋ฌธ์ž์—ด์ด๋‚˜ Symbol์„ ์†์„ฑ์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์œ ํšจํ•œ์‹๋ณ„์ž๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋œ๋‹ค. 1foo , !bar! , ์‹ฌ์ง€์–ด ๊ณต๋ฐฑ ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” foo['name'] ์ฒ˜๋Ÿผ ' ' ๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•œ๋‹ค.


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


์ฐธ๊ณ ์ž๋ฃŒ#

๐Ÿ”—MDN web docs - ์†์„ฑ ์ ‘๊ทผ์ž

๐Ÿ”—MDN web docs - ์‹๋ณ„์ž

๐Ÿ”—JavaScript Object['key'] vs Object.key ์ฐจ์ด


ยท ์•ฝ 6๋ถ„

JavaScript#

๊ฐ์ฒด#

  • ๊ฐ์ฒด ์„ ์–ธ
const ironMan = {    'name': 'ํ† ๋‹ˆ์Šคํƒ€ํฌ',    'actor': '๋กœ๋ฒ„ํŠธ ๋‹ค์šฐ๋‹ˆ ์ฃผ๋‹ˆ์–ด',    'alias': '์•„์ด์–ธ๋งจ',    'key is string': true,};

๊ฐ์ฒด๋Š” { } ๋กœ ๊ฐ์‹ธ๊ณ  key: value ํŽ˜์–ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, key ๋Š” ๋ฌธ์ž์—ด๋กœ ๊ณต๋ฐฑ์ด ์žˆ๋‹ค๋ฉด ' ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค. ๋˜ํ•œ , ๋ฅผ ๋นผ๋†“์œผ๋ฉด error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๊ฐ์ฒด ํ˜ธ์ถœ
console.log(ironMan);// Object {name: "ํ† ๋‹ˆ์Šคํƒ€ํฌ", actor: "๋กœ๋ฒ„ํŠธ ๋‹ค์šฐ๋‹ˆ ์ฃผ๋‹ˆ์–ด", alias: "์•„์ด์–ธ๋งจ"}
console.log(ironMan.name);// ํ† ๋‹ˆ์Šคํƒ€ํฌ
console.log(ironMan.actor);// ๋กœ๋ฒ„ํŠธ ๋‹ค์šฐ๋‹ˆ ์ฃผ๋‹ˆ์–ด
console.log(ironMan.alias);// ์•„์ด์–ธ๋งจ
  • ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถ„ํ•ด
const {alias, name, actor} = hero;const text = `${alias}(${name}) ์—ญํ• ์„ ๋งก์€ ๋ฐฐ์šฐ๋Š” ${actor} ์ž…๋‹ˆ๋‹ค.`;console.log(text);

๊ฐ์ฒด์—์„œ ๊ฐ’์„ ์ถ”์ถœํ•ด๋ƒ„.

  • ๊ฐ์ฒด ๋‚ด๋ถ€ ํ•จ์ˆ˜
const dog = {    name: '๋ฉ๋ฉ์ด',    sound: '๋ฉ๋ฉ!',    say: function () {        console.log(this.sound);    },};

function() ์€ ์ต๋ช… ํ•จ์ˆ˜์ด์ง€๋งŒ, function dogFunc() ์ฒ˜๋Ÿผ named ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด๋„ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

const dog = {    name: '๋ฉ๋ฉ์ด',    sound: '๋ฉ๋ฉ!',    say: () => {        console.log(this.sound);    },};
dog.say();
// TypeError: Cannot read property 'sound' of undefined

function ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ this ๋กœ ์ž์‹ ์ด ์†ํ•œ ์œ„์น˜์™€ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์ž๊ธฐ ์ž์‹ ์ด ์†ํ•œ this ๊ฐ€ ์–ด๋””์ธ์ง€ ๋ชจ๋ฅธ๋‹ค

const dog = {    name: '๋ฉ๋ฉ์ด',    sound: '๋ฉ๋ฉ!',    say: function () {        console.log(this.sound);    },};
const cat = {    name: '์•ผ์˜น์ด',    sound: '์•ผ์˜น~',};
cat.say = dog.say;dog.say(); // ๋ฉ๋ฉ!cat.say(); // ์•ผ์˜น~
// Errorconst dogSay = dog.say;const catSay = cat.say;dogSay();catSay();

cat.say = dog.say; ๋กœ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋งŒ์•ฝ ์™ธ๋ถ€์— ์žˆ๋Š” const dogSay ์— ํ• ๋‹นํ•œ๋‹ค๋ฉด, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ this ๊ฐ€ ์–ด๋Š scope ์ธ์ง€๋ฅผ ์•Œ์ง€ ๋ชปํ•ด error ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • getter์™€ setter ํ•จ์ˆ˜
// EX 1const dog = {    _name: '๋ฉ๋ฉ์ด',    get name() {        console.log('_name์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.');        return this._name;    },    set name(value) {        console.log('์ด๋ฆ„์ด ๋ฐ”๋€๋‹ˆ๋‹ค..' + value);        this._name = value;    },};
console.log(dog.name);dog.name = '๋ญ‰๋ญ‰์ด';console.log(dog.name);
// EX 2const numbers = {    _a: 1,    _b: 2,    sum: 3,    calculate() {        console.log('calculate');        this.sum = this._a + this._b;    },    get a() {        return this._a;    },    get b() {        return this._b;    },    set a(value) {        this._a = value;        this.calculate();    },    set b(value) {        this._b = value;        this.calculate();    },};
console.log(numbers.sum);numbers.a = 5;numbers.a = 6;numbers.a = 7;numbers.a = 8;console.log(numbers.sum);

get ํ•จ์ˆ˜์™€ sum ํ•จ์ˆ˜๋Š” ์ด๋ฆ„์ด ๊ฐ™์•„๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜์™€ ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด ์•ˆ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๋ช… ์•ž์— _ ๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

EX2์—์„œ์ฒ˜๋Ÿผ get, set์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์žฅ์ ์€ a์˜ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ์— calculate ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ sum ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋ฏ€๋กœ ํšจ์œจ์ ์ด๋‹ค.

  • ๊ฐ์ฒด ๋‚ด์žฅ ํ•จ์ˆ˜
const doggy = {    ์ด๋ฆ„: '๋ฉ๋ฉ์ด',    ์†Œ๋ฆฌ: '๋ฉ๋ฉ',};
console.log(doggy);
console.log(Object.entries(doggy));console.log(Object.keys(doggy));console.log(Object.values(doggy));

๋ฐฐ์—ด#

JS์—์„œ ๋ฐฐ์—ด์€ ํƒ€์ž…์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ex) [ 'a', 1, 'text' ]

๋ฐฐ์—ด ๋‚ด์žฅํ•จ์ˆ˜

  • push

  • pop

  • length

๋ฐ˜๋ณต๋ฌธ#

  • for ๋ฌธ

  • while ๋ฌธ

  • for - of

const numbers = [10, 20, 30, 40, 50];
for (let number of numbers) {    console.log(number);}

์ปฌ๋ ‰์…˜ ์ „์šฉ ๋ฐ˜๋ณต ๊ตฌ๋ฌธ

  • for - in
var obj = {    a: 1,    b: 2,    c: 3,};
for (var prop in obj) {    console.log(prop, obj[prop]); // a 1, b 2, c 3}

๊ฐ์ฒด์˜ ์†์„ฑ๋“ค์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ž‘์—… ์ˆ˜ํ–‰.

  • continue

๋ฐ˜๋ณต๋ฌธ ์ค‘์— ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์‹คํ–‰.

  • break

๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ.

  • foreach
const superheroes = ['์•„์ด์–ธ๋งจ', '์บกํ‹ด ์•„๋ฉ”๋ฆฌ์นด', 'ํ† ๋ฅด', '๋‹ฅํ„ฐ ์ŠคํŠธ๋ ˆ์ธ์ง€'];
superheroes.forEach((hero) => {    console.log(hero);});
  • map
const array = [1, 2, 3, 4, 5, 6, 7, 8];
const square = (n) => n * n;const squared = array.map(square);
console.log(squared);
// ๋” ๊ฐ„๋žตํžˆconst array = [1, 2, 3, 4, 5, 6, 7, 8];const squared = array.map(n => n * n;);
console.log(squared);
  • indexOf
const superheroes = ['์•„์ด์–ธ๋งจ', '์บกํ‹ด ์•„๋ฉ”๋ฆฌ์นด', 'ํ† ๋ฅด', '๋‹ฅํ„ฐ ์ŠคํŠธ๋ ˆ์ธ์ง€'];const index = superheroes.indexOf('ํ† ๋ฅด');console.log(index);
  • findIndex
const todos = [    {        id: 1,        text: '์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž…๋ฌธ',        done: true,    },    {        id: 2,        text: 'ํ•จ์ˆ˜ ๋ฐฐ์šฐ๊ธฐ',        done: true,    },    {        id: 3,        text: '๊ฐ์ฒด ๋ฐฐ์—ด ๋ฐฐ์šฐ๊ธฐ',        done: true,    },    {        id: 4,        text: '๋‚ด์žฅ ํ•จ์ˆ˜ ๋ฐฐ์šฐ๊ธฐ',        done: false,    },];
const index = todos.findIndex((todo) => todo.id === 3);console.log(index);
  • find

  • filter


ยท ์•ฝ 3๋ถ„

TIL#

TIL ์ž‘์„ฑ์— ๋„ˆ๋ฌด ๋ฌด๋ฆฌ๋ฅผ ํ•˜๋Š” ๋‚˜ ์ž์‹ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” TIL์„ ์–ด๋–ค ์–ธ์–ด๋‚˜ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ํ•œ ํ† ํ”ฝ ์ •๋„๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ–ˆ์œผ๋‚˜, ์ด ์ƒ๊ฐ์€ ๋‹ค์Œ์˜ ์ž˜๋ชป๋œ ๊ณต๋ถ€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋Œ์—ˆ๋‹ค.

  • ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„ ๋˜๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ๋†“์น˜์ง€ ์•Š๊ณ  ์ •๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ํ”ผ๋กœ๋„๋ฅผ ๋†’์˜€๋‹ค.

  • ๋‚ด ์ž์‹ ์˜ ์ƒ๊ฐ์ด๋‚˜ ๋Š๋‚Œ์ด ๋‹ด๊ฒจ์žˆ์ง€ ์•Š์•˜๋‹ค.


TIL ์žฌ์ •์˜#

์–ด๋Š ์ˆœ๊ฐ„ ๋„ˆ๋ฌด ์ •ํ™•ํ•œ ์ž๋ฃŒ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ์• ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

TIL์€ ๋‚ด๊ฐ€ ๋‹ค์‹œ ๋ณด๊ณ  ์ดํ•ดํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์ง€ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์“ฐ๋Š” ๊ธ€์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„ˆ๋ฌด ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ํ•„์š”๋„ ์—†๋‹ค.

(๋ˆ„๊ฐ€ ๋ณธ๋‹ค๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ ค๊ณ  ์• ์ผ๋Š”์ง€..)

"TIL์€ ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ์„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ์ € ๋‚  ๊ฒƒ์˜ ์ƒ๊ฐ์„ ๊ธฐ๋กํ•ด๋†“๋Š” ๊ฒƒ์ด๋‹ค." ๋ผ๊ณ  ์žฌ์ •์˜ํ•œ๋‹ค.

๊ทธ ์ดํ›„์— ๋‚  ๊ฒƒ์˜ ์ƒ๊ฐ์ด ์ข€ ๋” ์ •์ œ๋˜๋ฉด, ๋ธ”๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฃจ๊ฑฐ๋‚˜ TIL์— ์ฃผ์ œ ๋ณ„๋กœ๋ฌถ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.


์ž๊ทน์ด ๋˜๋Š” TIL์˜ ์„ ๋ฐฐ๋‹˜๋“ค#

TIL์„ 1๋…„๋™์•ˆ ์ง„ํ–‰ํ•˜๋ฉฐ - ๋ฐ•์ค€์šฐ๋ธ”๋กœ๊ทธ

์ผ์ผ์ปค๋ฐ‹์˜ ํšจ์šฉ์„ฑ - jojoldu

์ผ์ผ์ปค๋ฐ‹(Daily Commit) - 100์ผ ํšŒ๊ณ  - ์ง„์œ ๋ฆผ

์ผ์ผ์ปค๋ฐ‹(Daily Commit) โ€“ 1๋…„ ํšŒ๊ณ  - ์ง„์œ ๋ฆผ

๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ํ–ˆ๋‚˜, 1ํŽธ - Jbee

๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ํ–ˆ๋‚˜, 2ํŽธ - Jbee

ยท ์•ฝ 12๋ถ„

0228#

ํ† ์ต์Šคํ”ผํ‚น#

"์กธ์—… ์š”๊ฑด" + "์ทจ์—…"

๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์„ ์œ„ํ•ด ํ† ์ต์Šคํ”ผํ‚น ์‹œํ—˜์„ ์ค€๋น„ํ–ˆ๋‹ค.

์กธ์—… ์š”๊ฑด์€ Lv.5, ์ทจ์—…์—๋Š” ์ตœ์†Œ Lv.6๋ฅผ ์š”๊ตฌํ•˜๋Š” ํšŒ์‚ฌ๊ฐ€ ๋งŽ์•˜๋‹ค.

๋ชฉํ‘œ๋Š” ๋‚ด์‹ฌ Lv.7์„ ๊ธฐ๋Œ€ํ•˜๋ฉด์„œ Lv.6๋กœ ์žก์•˜๋‹ค. (์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ฐธ ์•ˆ์ผํ–ˆ๋˜ ๋ชฉํ‘œ์„ค์ •)

  • ๋…ํ•™ (์œ ํŠœ๋ธŒ)

  • ์ธํ„ฐ๋„ท ๊ฐ•์˜

  • ํ•™์›

3๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๋น ๋ฅธ ์‹œ๊ฐ„ ์•ˆ์— ์ ์ˆ˜๋ฅผ ์–ป๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— + ํ† ์ต์Šคํ”ผํ‚น์‹œํ—˜์˜ ์„ฑ๊ฒฉ์„ ์ „ํ˜€ ๋ชฐ๋ž๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋ƒฅ ํ•™์›์„ ๋‹ค๋‹ˆ๊ธฐ๋กœ ํ–ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒ ์˜ค์ „ ๊ต๋‚ด ๊ทผ๋กœ์™€ ์˜คํ›„ ํ•™์›์„ ๋ณ‘ํ–‰ํ•˜๋‹ˆ ( ์ง‘ -> ํ•™๊ต -> ๊ฐ•๋‚จ -> ์ง‘ ์˜ ์‚ด์ธ์ ์ธ ํ†ตํ•™ ์Šค์ผ€์ฅด..) 2์ฃผ๊ฐ€ ์ˆœ์‹๊ฐ„์— ์ง€๋‚˜๊ฐ”๊ณ , ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜์ง€ ์•Š์€ ํƒ“์— ๋‹น์žฅ ์‹œํ—˜๋ณผ ์ž์‹ ์ด ์—†์–ด 1์ฃผ๊ฐ„ ์ถ”๊ฐ€๋กœ ๋…ํ•™์„ ํ–ˆ๋‹ค.

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

๊ทธ๋Ÿฐ๋ฐ ์‹œํ—˜์žฅ์— ๊ฐ€๋‹ˆ ์Šคํ”ผํ‚นํ•˜๊ธฐ ์ข‹์€(?) ํ™˜๊ฒฝ์—์„œ ์–ด๋Š ์ •๋„์˜ ๊ธด์žฅ๊ฐ๊ณผ ํ•จ๊ป˜ ์‹œํ—˜์„ ์น˜๋ฃจ๋‹ˆ ์˜คํžˆ๋ ค ๋ชจ์˜๊ณ ์‚ฌ ํ’€ ๋•Œ๋ณด๋‹ค ์ง‘์ค‘๋˜๊ณ  ์ž˜ ๋ณธ ๋Š๋‚Œ์ด์—ˆ๋‹ค.

๋ฐ˜์„ฑ#

๊ฒฐ๊ณผ๋Š” Lv.6. ์•„๋ฌดํŠผ ํ•„์š”ํ•œ ์š”๊ตฌ์กฐ๊ฑด์€ ๋งŒ์กฑ์‹œ์ผฐ์ง€๋งŒ ๋‚˜๋ฆ„ Lv.7์„ ๋ฐ”๋ž˜์„œ ๊ทธ๋Ÿฐ์ง€ ์กฐ๊ธˆ ์‹ค๋ง์Šค๋Ÿฌ์› ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์•ˆ์ผํ•˜๊ฒŒ ์ƒˆ์šด ๋ชฉํ‘œ์— ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ์˜€๋˜ ๊ฒƒ ๊ฐ™๊ณ , ์‹œํ—˜์„ ์ž˜ ๋ด์•ผํ•˜๋Š” ์ด์œ  ์ž์ฒด๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์•„๋ฌดํŠผ ์—ฌ๊ธฐ๊นŒ์ง€ TIL์„ 3์ฃผ๊ฐ„ ๊ฒŒ์„๋ฆฌํ•œ ๋ณ€๋ช…์ด๋‹ค.

JavaScript#

๋“œ๋””์–ด HTML, CSS๋ฅผ ๋๋‚ด๊ณ  JavaScript๋กœ ๋„˜์–ด์™”๋‹ค. Markup Language๋งŒ ํ•˜๋‹ค๊ฐ€ ์˜ค๋žœ๋งŒ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ˆ ์˜คํžˆ๋ ค ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. HTML, CSS๋Š” ์†์„ฑ ์—ญํ• ์„ ์ˆ™์ง€ํ•˜๊ณ , ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๋Š” ์ˆ˜์ค€์ด๋ผ ํฅ๋ฏธ๊ฐ€ ๋–จ์–ด์กŒ๊ณ , JS๋ฅผ ๋‹ค๋ฃฐ ์ค„ ์•Œ์•„์•ผ ์˜๋ฏธ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค ์‹ถ์–ด JS๋ฅผ ๋นจ๋ฆฌ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๊ธฐ์ดˆ์ ์ธ ๋ฌธ๋ฒ•#

ํ”„๋ก ํŠธ์—”๋“œ ์›น๊ฐœ๋ฐœ ํŒจํ‚ค์ง€ ๊ฐ•์ขŒ๋ฅผ ํ†ตํ•ด ๊ธฐ์ดˆ์ ์ธ JS ๋ฌธ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ์œ ์‚ฌํ•œ ๋ถ€๋ถ„์€ ์ง€๋‚˜๊ฐ€๊ณ , ์œ ์˜ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋ฐœ๊ฒฌํ•œ ๋ถ€๋ถ„๋งŒ ์ •๋ฆฌํ•œ๋‹ค.

MISC#

  • CodeSandbox : javascript๋ฅผ ํ•™์Šตํ•˜๊ธฐ ์ข‹์€ ide

  • ์Œ๋”ฐ์˜ดํ‘œ " ์™€ ๋”ฐ์˜ดํ‘œ ' ๋Š” ๋‘˜ ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ๊ฐ€๋Šฅ. (CodeSandbox์—์„œ๋Š” .prettierrc ์—์„œ ์„ค์ •์„ ํ†ตํ•ด cmd + s ํ•  ๋•Œ ๋”ฐ์˜ดํ‘œ์™€ ์Œ๋”ฐ์˜ดํ‘œ ์ค‘ ์„ ํƒํ•œ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ค€๋‹ค.)

  • ; ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ. ํ•˜์ง€๋งŒ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๊ถŒ์žฅ.

๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜#

JS์—์„œ๋Š” ๋ณ€์ˆ˜, ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ type ๋ณ„๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  let , const , ๊ทธ๋ฆฌ๊ณ  var ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • let ์€ ๋ณ€์ˆ˜, ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ๋˜ ๋‹ค์‹œ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.

  • const ๋Š” ์ƒ์ˆ˜, ํ•œ๋ฒˆ ์„ค์ •ํ•˜๋ฉด ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค. immutable

  • var ์—ญ์‹œ ๋ณ€์ˆ˜. ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ๋˜ ๋‹ค์‹œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

var ๋Š” ํ˜„์žฌ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜.IE9, IE10 ๋“ฑ์˜ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” let , const ๊ฐ€ ์—†์–ด์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค.ํ•˜์ง€๋งŒ Babel ์ด๋ผ๋Š” ๋„๊ตฌ๋ฅผ ํ†ตํ•ด JS ์ฝ”๋“œ๊ฐ€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋Œ์•„๊ฐ€๋„๋ก ํ˜ธํ™˜ํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— var ๋ฅผ ์™„์ „ํžˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ์™ธ์—๋„ var , let , const ๋Š” scope ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • var ๋Š” function-scoped

  • let , const ๋Š” block-scoped

์ด๋Š” hoisting , IIFE ์™€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”๋ฐ, ์ •๋ฆฌ๋œ ๋งํฌ๊ฐ€ ์žˆ์–ด์„œ ๋งํฌ๋กœ ์ฒจ๋ถ€ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋ณด๊ณ  ๊ณต๋ถ€ํ•˜์ž.

๐Ÿ”— var, let, const ์ฐจ์ด์ ์€?

Null, undefined#

null : ์—†๋Š” ๊ฒƒ.

undefined : ๊ฐ’์ด ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์Œ

var variable;console.log(variable); // undefined

๋น„๊ต ์—ฐ์‚ฐ์ž#

๋‹ค๋ฅธ PL๊ณผ ๋‹ฌ๋ฆฌ == , === ๋‘ ๊ฐ€์ง€์˜ ์ผ์น˜์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š”๋ฐ,

== : ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Œ (์ˆซ์ž 2์™€ ๋ฌธ์ž '2'๊ฐ€ ๋™์ผ)

=== : ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•จ.

ํ•จ์ˆ˜#

ํ•จ์ˆ˜๋Š” ์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ค„๋ณธ ์ ์ด ์žˆ์ง€๋งŒ, ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณธ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์™ธ๋ถ€ (๋˜๋Š” ์žฌ๊ท€(recursion)์˜ ๊ฒฝ์šฐ์—” ๋‚ด๋ถ€) ์ฝ”๋“œ์— ์˜ํ•ดํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋Š” "ํ•˜์œ„ํ”„๋กœ๊ทธ๋žจ"์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ๊ทธ ์ž์ฒด์ฒ˜๋Ÿผ, ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ๋ชธํ†ต (function body)์ด๋ผ๊ณ  ํ•˜๋Š” ์ผ๋ จ์˜ ๊ตฌ๋ฌธ(statement)์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•จ์ˆ˜์—์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๊ณ  ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. - MDN web docs - ํ•จ์ˆ˜

JavaScript์—์„œ์˜ ํ•จ์ˆ˜์˜ ํŠน์ง•์€ ์ด๋ ‡๋‹ค๊ณ  ํ•œ๋‹ค.

JavaScript์—์„œ, ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ์— ์ผ๊ธ‰ (first-class) ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด, ํ•จ์ˆ˜๋Š” Function ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. - MDN web docs - ํ•จ์ˆ˜

ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” return ๋ฌธ์ด ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, return ๋ฌธ์ด ์—†๋‹ค๋ฉด ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ธฐ๋ณธ ๋ฐ˜ํ™˜๊ฐ’์€ undefined ์ด๋‹ค.

ํ•จ์ˆ˜ ์ •์˜#

ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ.

  • ํ•จ์ˆ˜ ์„ ์–ธ

  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹(expression)

  • Function ์ƒ์„ฑ์ž

๋จผ์ € ํ•จ์ˆ˜ ์„ ์–ธ์€ ์ด๋ ‡๋‹ค.

function name([param[, param[, ... param]]]) {   statements}

ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ ์ดํ›„์— ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— name ์ด ํ•„์ˆ˜์ ์ด๊ณ , param ์€ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ˆ˜์˜ ์ด๋ฆ„์œผ๋กœ 255๊ฐœ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค. statements ๋Š” ํ•จ์ˆ˜์˜ ๋ชธํ†ต์„ ๊ตฌ์„ฑํ•œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋‹ค.

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ๋น„์Šทํ•˜๊ณ  ๊ตฌ๋ฌธ์ด ๊ฐ™์€๋ฐ, ์ฐจ์ด์ ์€ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

var myFunction = function [name]([param[, param[, ... param]]]) {   statements}

์ด ๋•Œ๋Š” name ์„ ์ƒ๋žตํ•˜๊ณ , ์ต๋ช…(anonymous) ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , name ์„ ๋„ฃ์–ด์„œ named ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ต๋ช… ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ณ€์ˆ˜๋ช…(์œ„์—์„  myFunction )์„ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์•ˆ๋˜๋Š”๋ฐ, ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๊ฐ’์ด myFunction ์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฒƒ์ด๋‹ค.

์–ด๋””๊นŒ์ง€๋‚˜ '์ต๋ช…' ํ•จ์ˆ˜์ด๊ณ , ํ•จ์ˆ˜ ๋ณ€์ˆ˜์ธ myFunction ์„ ํ†ตํ•ด ํ˜ธ์ถœ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ named ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ์— ํ•จ์ˆ˜ ๋ณ€์ˆ˜์ธ myFunction ์œผ๋กœ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•จ์ˆ˜ ์ด๋ฆ„ name ์œผ๋กœ๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ์™ธ๋ถ€์—์„œ๋Š” ํ˜ธ์ถœํ•  ์ˆ˜์—†๋‹ค.

Function ์ƒ์„ฑ์ž๋Š” ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ๊ถŒ์žฅ๋˜์ง€๋„ ์•Š๋Š” ๋ฐฉ์‹์ธ๋ฐ, ๊ตณ์ด ์•Œ์•„๋ณด์ž๋ฉด,

var myFunction = new Function(arg1, arg2, ...argN, functionBody);
var myFunction = new Function('a', 'b', 'console.log(a+b)');myFunction(1, 3); // 4

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์ค‘์š”ํ•œ ์ฐจ์ด๋Š” ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋‹ค. ํ•œ๊ตญ์–ด๋กœ๋Š” '๋Œ์–ด์˜ฌ๋ฆผ'์„ ๋œปํ•œ๋‹ค.

์ธํ„ฐํ”„๋ฆฐํ„ฐ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•จ์— ์žˆ์–ด์„œ Global ์˜์—ญ์˜ ์„ ์–ธ๋œ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ์ตœ์ƒ์˜ Scope๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์„ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ ํ•œ๋‹ค. - Function Declarations(ํ•จ์ˆ˜์„ ์–ธ) vs Function Expressions(ํ•จ์ˆ˜ํ‘œํ˜„)์—์„œ

๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์„œ ์„ ์–ธ๋ฌธ์€ ํ•ญ์ƒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๊ตฌ๋™์‹œ ์ตœ์šฐ์„ ์ ์œผ๋กœ ํ•ด์„๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ• ๋‹น์€ hoisting์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

// ์˜ˆ์ œ 1 : ํ•จ์ˆ˜์„ ์–ธ์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ…foo();function foo() {    console.log('hello');};> hello
// ์˜ˆ์ œ 2 : ํ•จ์ˆ˜ํ‘œํ˜„์—์„œ์˜ ํ˜ธ์ด์ŠคํŒ…bar();var bar = function() {    console.log('hello');};> TypeError: bar is not a function

์˜ˆ์ œ ์ถœ์ฒ˜ : Function Declarations(ํ•จ์ˆ˜์„ ์–ธ) vs Function Expressions(ํ•จ์ˆ˜ํ‘œํ˜„)

์˜ˆ์ œ1์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ์„ ์–ธ์˜ ๊ฒฝ์šฐ๋Š” ์„ ์–ธ๋ฌธ์ด hoisting ๋˜์–ด ์ตœ์ƒ์˜ scope๋กœ ๋Œ์–ด์˜ฌ๋ ค์กŒ๊ธฐ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ์ด๋ฆ„์ธ foo(); ๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์˜ˆ์ œ 2์˜ ๊ฒฝ์šฐ๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์œผ๋กœ ๋˜์–ด์žˆ๊ณ , ๋”ฐ๋ผ์„œ hoisting๋˜๋Š” ๋ถ€๋ถ„์€ ์„ ์–ธ๋ถ€๋ถ„์ธ var bar; ๋ฟ์ด๋‹ค. ๋”ฐ๋ผ์„œ bar(); ๋กœ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ๋Š” bar ๋Š” ๋‹จ์ง€ ๋ณ€์ˆ˜์ผ๋ฟ์ด๋ผ์„œ TypeError: bar is not a function ์˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด์™ธ์— IIFE , Closure ๋“ฑ์˜ ๊ฐœ๋…์ด ์—ฐ๊ด€๋œ ๊ฒƒ๊นŒ์ง€ ํ™•์ธํ•˜์˜€๋Š”๋ฐ, ์ด๋Š” ๋‹ค์Œ์— ์•Œ์•„๋ณด๋Š” ๊ฒƒ์œผ๋กœ ๋งˆ์นœ๋‹ค.

Reference#

๐Ÿ”— MDN web docs - ํ•จ์ˆ˜

๐Ÿ”— Function Declarations(ํ•จ์ˆ˜์„ ์–ธ) vs Function Expressions(ํ•จ์ˆ˜ํ‘œํ˜„)

๐Ÿ”— ํ•จ์ˆ˜ ํ‘œํ˜„์‹ vs ํ•จ์ˆ˜ ์„ ์–ธ์‹

๐Ÿ”— Javascript IIFE ์ดํ•ดํ•˜๊ธฐ

๐Ÿ”— var, let, const ์ฐจ์ด์ ์€?

๐Ÿ”— [JS] ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•: ํ•จ์ˆ˜ ํ‘œํ˜„์‹, ํ•จ์ˆ˜ ์„ ์–ธ, Hoisting