[BOOK] ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์˜ ๊ธˆ์†

์‚ฌ๋žŒ๋‹ต๊ฒŒ ์‚ด๊ธฐ ์œ„ํ•œ ํ•œ ๋‹ฌ์— ํ•œ ๊ถŒ(2021/12)

– ํฌ๊ท€ ๊ธˆ์†์ด ๋ญ์ง€?

ํฌํ† ๋ฅ˜(rare earth elements, ็จ€ๅœŸ้กž)๋ž€ ๋ฌด์—‡์ผ๊นŒ?

ํฌํ† ๋ฅ˜๋Š” ์ฒ , ๊ตฌ๋ฆฌ, ์•„์—ฐ๊ณผ ๊ฐ™์ด ํŠน์ • ๊ธˆ์†์ด๋‚˜ ๊ด‘๋ฌผ์˜ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ๋œป ๊ทธ๋Œ€๋กœ ํฌ๊ท€ํ•œ ๊ด‘๋ฌผ์˜ ๋ฌด๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋ž€ํƒ„, ์„ธ๋ฅจ, ํ”„๋ผ์„ธ์˜ค๋””๋ฎด, ๋„ค์˜ค๋””๋ฎด, ํ”„๋กœ๋ฉ”ํŠฌ, ์‚ฌ๋งˆ๋ฅจ, ์œ ๋กœํ“ธ, ๊ฐ€๋Œ๋ฆฌ๋Š„, ํ…Œ๋ฅด๋ธ€, ๋””์Šคํ”„๋กœ์Š˜, ํ™€๋ฎด, ์—๋ฅด๋ธ€, ํˆด๋ฅจ, ์ดํ…Œ๋ฅด๋ธ€, ๋ฃจํ…ŒํŠฌ, ์Šค์นธ๋“, ์ดํŠธ๋ฅจ ์ด๋ ‡๊ฒŒ ์ด 15๊ฐ€์ง€๊ฐ€ ํฌํ† ๋ฅ˜๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ด‘๋ฌผ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํฌ๊ท€ ๊ธˆ์†์€ ๋ฌด์—‡์ผ๊นŒ?

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

ํฌ๊ท€ ๊ธˆ์†์€ ํ”ํ•œ ๊ธˆ์†๊ณผ ๊ฒฐํ•ฉํ•ด ์žˆ๊ฑฐ๋‚˜ ๋˜๋Š” ์ง€ํ‘œ๋ฉด์— ํ˜•์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด์„œ ๋งค์šฐ ๋ฏธ๋ฏธํ•œ ๋น„์ค‘์„ ์ฐจ์ง€ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด 1ํ†ค์˜ ๋ฐ”์œ„์—์„œ ๊ฒจ์šฐ 1g์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋˜๋Š” ๋” ์ ์€ ๋น„์ค‘์œผ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์–‘์ด ๋งค์šฐ ๋ฏธ๋ฏธํ•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ํฌ๊ท€ ๊ธˆ์†์ด ‘์ง€์ •ํ•™ ์ „์Ÿ์˜ ์”จ์•—’์ด๋ผ๊ณ  ๋ถˆ๋ฆด ๋งŒํผ ์ค‘์š”ํ•œ ์ž์›์ด ๋˜์—ˆ์„๊นŒ?

ํฌํ† ๋ฅ˜๋Š” ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ™”ํ•™์ , ๊ด‘ํ•™์  ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด‰๋งค ์—ญํ• ๋„ ํ•˜๋ฏ€๋กœ ๋งŽ์€ ๊ธฐ์ˆ ์—์„œ ํ•„์ˆ˜ ์›๋ฃŒ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

ํฌ๊ท€ ๊ธˆ์†์€ ์—”์ง„, ํœด๋Œ€ํฐ, ์ž๋™์ฐจ ๋“ฑ์— ๋“ค์–ด๊ฐ€๋Š” ๋ชจํ„ฐ์™€ ์ „์ž์ œํ’ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ˜๋„์ฒด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ Œ์ฆˆ, ์กฐ๋ช…, ์œ ๋ฆฌ, ๋ ˆ์ด์ €, ๋””์Šคํ”Œ๋ ˆ์ด ๋“ฑ ๋งŽ์€ ์ œํ’ˆ ์›๋ฃŒ๋กœ ์‚ฌ์šฉ๋˜์–ด ์ „๊ธฐ, ์ „์ž, ์œ„์„ฑ, ํ†ต์‹ , ํ•ญ๊ณต, ์šด์†ก, ์—๋„ˆ์ง€ ๋“ฑ ๊ฑฐ์˜ ๋ชจ๋“  ์˜์—ญ์—์„œ ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

์•„์ดํฐ ํ•˜๋‚˜์— ๋“ค์–ด๊ฐ€๋Š” ํฌ๊ท€ ๊ธˆ์†์˜ ์ข…๋ฅ˜๋„ ์—ด ๋ช‡๊ฐ€์ง€๋‚˜ ๋œ๋‹ค. ๋ฌผ๋ก  ์–‘์€ ์•„์ฃผ ์†Œ๋Ÿ‰์ด๊ฒ ์ง€๋งŒ.


– ํฌ๊ท€ ๊ธˆ์†์€ ์–ด๋””์„œ?

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ์ด ํฌ๊ท€ ๊ธˆ์†์„ ์ƒ์‚ฐํ•˜๋Š” ๋‚˜๋ผ๋Š” ์–ด๋””์ผ๊นŒ?

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

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

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

ํ•œ ๋•Œ๋Š” ์„์œ ๊ฐ€ ๊ตญ๋ ฅ์ด์ž ๋ฌด๊ธฐ๊ฐ€ ๋œ ์ ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ด์ œ๋Š” ํฌ๊ท€ ๊ธˆ์†์ด ๋ฌด๊ธฐ๊ฐ€ ๋˜๊ณ  ์›๋ฃŒ ๊ณต๊ธ‰๊ตญ์ด ํ•œ ๋‚˜๋ผ์˜ ์ œ์กฐ์™€ ๊ฒฝ์ œ๋ฅผ ์ขŒ์ง€์šฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋Œ€๊ฐ€ ๋˜์–ด๊ฐ€๊ณ  ์žˆ๋‹ค.

๊ฒฝ์ œ ๋…ผ๋ฆฌ๋Š” ๊ตฌ๋งค์ž๊ฐ€ ํŒ๋งค์ž๋ณด๋‹ค ์šฐ์œ„์— ์žˆ์ง€๋งŒ ์ด์ œ๋Š” ๊ตฌ๋งค์ž๊ฐ€ ์˜คํžˆ๋ ค ์•ฝ์ž๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ์ด ๋„๋ž˜ํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋”ฐ๋ผ์„œ ์•ˆ์ •์ ์ธ ์ œ์กฐ์—…์„ ์œ„ํ•ด ์ž๊ตญ ์ƒ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ์›๋ฃŒ๋Š” ๊ตญ๊ฐ€์ ์ธ ์ฐจ์›์—์„œ ์ง€์›์„ ํ†ตํ•ด ์ง์ ‘ ์ƒ์‚ฐํ•˜์—ฌ ๊ณต๊ธ‰๋ง์˜ ์•ˆ์ „์„ ๋„๋ชจํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ๊ฒƒ์ด ์ž‘๊ฐ€์˜ ์ƒ๊ฐ์ด๋‹ค.

์ž์›์ด ์•„๋‹Œ ๋ถ€์ง€๋Ÿฐํ•จ์œผ๋กœ ๋จน๊ณ  ์‚ฌ๋Š” ํ•œ๊ตญ๋„ ์ œ์กฐ์—…์ด ๋งŽ๋‹ค ๋ณด๋‹ˆ ํฌ๊ท€ ๊ธˆ์†์˜ ๋ฌด๊ธฐํ™”๋Š” ๋‹ค๋ฅธ ๋‚˜๋ผ์˜ ์ด์•ผ๊ธฐ๊ฐ€ ์•„๋‹ ๊ฒƒ ๊ฐ™๋‹ค.

์ˆ˜์ถœ ๊ทœ์ œ๋‚˜ ์š”์†Œ์ˆ˜ ๋Œ€๋ž€ ๋“ฑ์„ ํ†ตํ•ด ๊ฒฝํ—˜ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ณต๊ธ‰์˜ ์œ„๊ธฐ์— ๋Œ€์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ตญ๊ฐ€์ ์ธ ์ฐจ์›์—์„œ ์ „๋žต ์ž์›์— ํฐ ๊ด€์‹ฌ์„ ๋‘๊ณ  ์ค€๋น„๋ฅผ ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.



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

ใ‚ธใƒฃใƒใ‚นใ‚ฏใƒชใƒ—ใƒˆใ€ๆ–‡ๅญ—ๅˆ—ๆ“ไฝœ(JAVASCRIPT & STRING)

Javascriptๆ–‡ๅญ—ๅˆ—ใฎใƒกใ‚ฝใƒƒใƒ‰ : slice(), substring(), includes(), startsWith(), trim(), replace()…….

ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰(React, Vue, Angular)ใ‚‚ใƒใƒƒใ‚ฏใ‚จใƒณใƒ‰(Nodejs)ใ‚‚ใ‚ธใƒฃใƒใ‚นใ‚ฏใƒชใƒ—ใƒˆ(Javascript)ใŒไฝฟใ‚ใ‚Œใ‚‹ๆ™‚ไปฃใซใชใฃใฆใ€ใ ใ‚“ใ ใ‚“ใ‚ธใƒฃใƒใ‚นใ‚ฏใƒชใƒ—ใƒˆใฎๆ–‡ๆณ•ใŒ้‡่ฆใจใชใ‚Šใพใ™ใญใ€‚

ใใฎไธญใ€ๆ–‡ๅญ—ๅˆ—(String)้–ข้€ฃใฎใƒกใ‚ฝใƒƒใƒ‰ใฏใ‚ˆใไฝฟใ†ใฎใซใ€ใ‚ใพใ‚Š่ฆšใˆใฆใฏใ„ใชใ„ใ‚„ใคใงใ™ใญใ€‚๐Ÿ˜‚

ๆ–‡ๅญ—ๅˆ—้–ข้€ฃใฎใƒกใ‚ฝใƒƒใƒ‰ใฏไธ€ๅบฆ่ฆšใˆใฆใŠใใจ่‡ชๅ‹•ใซ่ฆšใˆใ‚‰ใ‚Œใ‚‹ใใ‚‰ใ„ไฝฟใ†้ ปๅบฆใŒ้ซ˜ใ„ใฎใงๆœ€ๅˆใ ใ‘้ ‘ๅผตใ‚Œใฐใงใ™ใญ๏ผ

ใงใฏใ€้ ป็นใซไฝฟใ†ใƒกใ‚ฝใƒƒใƒ‰ใฎไธญslice(), substring(), includes(), startsWith(), trim(), replace(), indexOf(), test()ใ‚’ใ”็ดนไป‹ใ—ใพใ™ใ€‚


sliceใƒกใ‚ฝใƒƒใƒ‰ใฏใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ใƒ‘ใƒฉใƒกใƒผใ‚ฟใงๆธกใ—ใ€ๅฟ…่ฆใชๆ–‡ๅญ—ๅˆ—ใ‚’ๆŠฝๅ‡บใ—ใพใ™ใ€‚

ใ‚นใ‚ฟใƒผใƒˆใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น(start index)ใจ็ต‚ไบ†ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น(end indexใ€็œ็•ฅๅฏ)ใ‚’ๆธกใ—ใ€็ต‚ไบ†ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’็œ็•ฅใ™ใ‚‹ๅ ดๅˆใฏๆ–‡ๅญ—ๅˆ—ใฎๆœ€ๅพŒใพใงใซใชใ‚Šใพใ™ใ€‚

ใƒ‘ใƒฉใƒกใƒผใ‚ฟใŒ๏ผใฎๅ ดๅˆใฏ้ ญใ‹ใ‚‰ไธ€็•ช็›ฎใ€-1ใฏ้€†ใงๅพŒใ‚ใ‹ใ‚‰ไธ€็•ช็›ฎใฎๆ„ๅ‘ณใซใชใ‚Šใพใ™ใ€‚

const myWord = 'primavera';

myWord.slice(0,5);   // 'prima'
myWord.slice(-4);    // 'vera'
myWord.slice(3);     // 'mavera'

myWord.slice(3,1);    // '' -> slice()ใฏใ‚นใ‚ฟใƒผใƒˆใŒ็ต‚ไบ†ใ‚ˆใ‚Šๅคงใใ„ใจ็ฉบใ‚’่ฟ”ใ™

substringใƒกใ‚ฝใƒƒใƒ‰ใ‚‚sliceใจๅŒใ˜ใใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ๆธกใ—ใ€ๆ–‡ๅญ—ๅˆ—ใ‚’ๆŠฝๅ‡บใ—ใพใ™ใ€‚

ๅŸบๆœฌ็š„ใชๆ“ไฝœใฏๅŒๆง˜ใงใ™ใŒsubstringใฏใ‚นใ‚ฟใƒผใƒˆใŒ็ต‚ไบ†ใ‚ˆใ‚Šๅคงใใ„ใฎๅ ดๅˆ่‡ชๅ‹•ใซไฝ็ฝฎใ‚’ไบคๆ›ใ—ใฆใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅฎŸๆ–ฝใ—ใพใ™ใ€‚

ใพใŸใ€substringใซ่ฒ ๆ•ฐใ‚’ๅ…ฅใ‚Œใ‚‹ใจ๏ผใจ่ช่ญ˜ใ—ใพใ™ใ€‚

ไพ‹ใˆใฐ(3, -1)ใ‚’ๆธกใ™ใจ(3, 0)ใจใ—ใฆ่ช่ญ˜ใ—ใพใ™ใ€‚ใใ‚Œใซ(3, 0)ใฏใ‚นใ‚ฟใƒผใƒˆใŒๅคงใใ„ใฎใง่‡ชๅ‹•ไบคๆ›ใ—ใ€(0, 3)ใ‚’ๅฎŸๆ–ฝใ—ใพใ™ใ€‚

ใƒกใ‚ฝใƒƒใƒ‰ๅใŒไผผใŸใ‚ˆใ†ใชsubstrใฏโ€™ไฝ็ฝฎโ€™ใจโ€™ๆ–‡ๅญ—ๆ•ฐ’ใ‚’ใƒ‘ใƒฉใƒกใƒผใ‚ฟใซๆธกใ™ใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใ€‚

const myWord = 'invierno';

myWord.substring(3);     // 'ierno'
myWord.substring(1,3);   // 'nv'

myWord.substring(3,1);   // 'nv' -> ่‡ชๅ‹•ใซใ‚นใ‚ฟใƒผใƒˆใจ็ต‚ไบ†ไฝ็ฝฎไบคๆ›

myWord.substring(3,-1);  // 'inv' -> ่ฒ ๆ•ฐใฏ0, ่‡ชๅ‹•ไฝ็ฝฎไบคๆ›

myWord.substring(-4);    // 'invierno' -> ่ฒ ๆ•ฐใฏ0, ใ‚นใ‚ฟใƒผใƒˆ(0)ใ‹ใ‚‰ๆœ€ๅพŒใพใง

myWord.substr(1,3);      // 'nvi' -> ใ‚นใ‚ฟใƒผใƒˆ1ใ‹ใ‚‰ไธ‰ใค

includesใฏๆ–‡ๅญ—ๅˆ—ใฎไธญใ€ๆŒ‡ๅฎšใ—ใŸๆ–‡ๅญ—ๅˆ—ใŒๅซใพใ‚Œใฆใ„ใ‚‹ใ‹ใ‚’ใƒใ‚งใƒƒใ‚ฏใ—ใพใ™ใ€‚

ใƒ‘ใƒฉใƒกใƒผใ‚ฟใฏๆ–‡ๅญ—ๅˆ—(ๅฟ…้ ˆ)ใจใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น(็œ็•ฅๅฏ)ใ‚’ๆธกใ—ใ€่ฟ”ใ™ใฎใฏtrueๆˆ–ใฏfalseใงใ™ใ€‚

ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏๆŒ‡ๅฎšๆ–‡ๅญ—ใฏใ‚‚ใกใ‚ใ‚“ใ€้…ๅˆ—ใฎไธญใง็ฉบใฎๅ€คใ‚’็ขบ่ชใ™ใ‚‹ใŸใ‚ใซใฏไฝฟใˆใพใ™ใ€‚

const myWord = 'alegria';

myWord.includes('le');       // true
myWord.includes('i');        // true
myWord.includes('rio');      // false

const myArray = ['dream','','king'];
myArray.includes('');       // true   -> myArray[1]ใŒ็ฉบใชใฎใงtrue
myArray.includes('dream');  // true   -> myArray[0]ใจไธ€่‡ด
myArray.includes('drea');   // false  -> ่ฆ็ด ใฏๅฎŒๅ…จไธ€่‡ดใ™ใ‚‹ๅ ดๅˆใฎใฟtrue

startsWithใƒกใ‚ฝใƒƒใƒ‰ใ‚‚ๆ–‡ๅญ—ๅˆ—ใŒๅซใพใ‚Œใฆใ„ใ‚‹ใ‹ใ‚’ใƒใ‚งใƒƒใ‚ฏใ—ใพใ™ใ€‚

ๆ–‡ๅญ—ๅˆ—ใฎใฟๆธกใ™ใจ0ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‹ใ‚‰ๅง‹ใพใ‚‹ๆŒ‡ๅฎšๆ–‡ๅญ—ใฎๅญ˜ๅœจใ‚’็ขบ่ชใ—ใ€BOOLEANใ‚’่ฟ”ใ—ใพใ™ใ€‚

endsWithใฏๆŒ‡ๅฎšๆ–‡ๅญ—ใง็ต‚ใ‚ใ‚‹ใ“ใจใ‚’ใƒใ‚งใƒƒใ‚ฏใ—ใพใ™ใ€‚

const mySentence = 'cafe con leche';

mySentence.startsWith('cafe');     // true
mySentence.startsWith('fe');       // false
mySentence.startsWith('fe',2);     // true

mySentence.endsWith('eche');      // true

trimใฏๆ–‡ๅญ—ๅˆ—ไธกๆ–ญใฎ็ฉบ็™ฝใ‚’้™คใใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใ€‚

ๆ–‡ๅญ—ๅˆ—ๅค‰ๆ›ใฎ้Ž็จ‹ใงๅ…ฅใ‚‰ใ‚ŒใŸ็ฉบ็™ฝใพใŸใฏใ‚ฟใ‚คใƒ—ใƒŸใ‚นใงๅ…ฅใฃใŸๆ–‡ๅญ—ๅˆ—ใฏๆ–‡ๅญ—ๆฏ”่ผƒใฎๆ™‚falseใ‚’่ฟ”ใ—ใ€ใ‚จใƒฉใƒผใซใชใ‚ŠใŒใกใงใ™ใ€‚

ใชใฎใงtrimใง็ฉบ็™ฝใ‚’ไบ‹ๅ‰ใซ้™คใใ€ใ‚จใƒฉใƒผใ‚’ไบˆ้˜ฒใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

ๆ–‡ๅญ—ๅˆ—ไธกๆ–ญใฎ็ฉบ็™ฝใ€ใ‚ฟใƒƒใƒ—ใ€ๆ”น่กŒ(/n)ๆ–‡ๅญ—ใ‚’้™คใใ“ใจใŒใงใใพใ™ใŒใ€ไธกๆ–ญใงใฏใชใๆ–‡ๅญ—ๅˆ—ไธญใซๅ…ฅใฃใฆใ„ใ‚‹ใฎใฏไฝœๅ‹•ใ—ใพใ›ใ‚“ใ€‚

const mySentence = '  la casa de papel   ';

mySentence.trim();        // 'la casa de papel'

const mySentence = ' el amor \n';

mySentence.trim();       // 'el amor'

replaceใฏๆ–‡ๅญ—ๅˆ—ใ‹ใ‚‰ๆŒ‡ๅฎšใ—ใŸๆ–‡ๅญ—ใ‚’ๆŽขใ—ใฆๅค‰ๆ›ๆ–‡ๅญ—ใซๅค‰ๆ›ใ—ใพใ™ใ€‚

ๆ–‡ๅญ—ๅˆ—ใฎไธญใซๆŒ‡ๅฎšๆ–‡ๅญ—ใŒไธ€ใคไปฅไธŠๅญ˜ๅœจใ™ใ‚‹ใจใใ€ๆœ€ๅˆใซ่ฆ‹ๅฝ“ใŸใ‚‹ใฎใ ใ‘ใŒๅค‰ๆ›ดๅฏพ่ฑกใซใชใ‚Šใพใ™ใ€‚

ไพ‹ใˆใฐ ‘my_name_is_Ron’ใ‹ใ‚‰ใ‚ขใƒณใƒ€ใƒผใƒใƒผใ‚’ๅ…จ้ƒจ็ฉบ็™ฝใซใ™ใ‚‹ใŸใ‚replace(‘_’,’ ‘)ใซใ—ใฆใ‚‚็ตๆžœใฏโ€™my name_is_Ron’ใซใชใ‚Šใพใ™ใ€‚

ใชใฎใงใ€ๆ–‡ๅญ—ๅˆ—ใฎไธญใงๅญ˜ๅœจใ™ใ‚‹ๅ…จใฆใ‚‚ๆŒ‡ๅฎšๆ–‡ๅญ—ใ‚’ๅค‰ๆ›ใ—ใŸใ„ๆ™‚ใฏๆญฃ่ฆ่กจ็พใ‚’ไฝฟใ†ใจ่กŒใ‘ใพใ™ใ€‚

const mySentence = 'my name is:Ron';

mySentence.replace(':',' ');        //'my name is Ron'

const mySentence = 'my_name_is_Ron';

mySentence.replace('_',' ');      // 'my name_is_Ron'

//ๆญฃ่ฆ่กจ็พใงใ™ในใฆใฎๆ–‡ๅญ—ใ‚’ๅค‰ๆ›
mySentence.replace(/_/g, ' ');    // 'my name is Ron'

indexOfใฏๆŒ‡ๅฎšๆ–‡ๅญ—ใฎไฝ็ฝฎใ‚’่ฟ”ใ—ใพใ™ใ€‚

ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏๆŒ‡ๅฎšๆ–‡ๅญ—ใฎๅ‰ใพใŸใฏๅพŒใงๆ–‡ๅญ—ๅˆ—ใ‚’ๅˆ‡ใ‚Šๅ–ใ‚‹ใจใๆœ‰็”จใชใ‚‚ใฎใงใ™ใ€‚

ใŸใจใˆใ€’Z001-03’ใ‹ใ‚‰ๅพŒใ‚ใฎ’03’ใ ใ‘ใ‚’ๆŠฝๅ‡บใ—ใŸใ„ใจใใ€indexOfใง’-‘ๆ–‡ๅญ—ใ‚’ๆŽขใ—ใ€่ฟ”ใ—ใฎindex +1ไฝ็ฝฎใ‹ใ‚‰ๆœ€ๅพŒใพใงใ‚ซใƒƒใƒˆใ™ใ‚‹ใจ’03’ใ‚’ๅˆ‡ใ‚Šๅ–ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

ใ‚‚ใ—ๆ–‡ๅญ—ๅˆ—ใฎไธญๆŒ‡ๅฎšๆ–‡ๅญ—ใŒไธ€ใคไปฅไธŠใฎๅ ดๅˆใ€้ ญใ‹ใ‚‰ๆŽขใ—ๅง‹ใ‚ๆœ€ๅˆใซ่ฆ‹ๅฝ“ใŸใ‚‹ๆ–‡ๅญ—ไฝ็ฝฎใ‚’่ฟ”ใ—ใพใ™ใ€‚

ใงใ‚‚ใƒ‘ใƒฉใƒกใƒผใ‚ฟใซindexใ‚’ๆธกใ™ใจๆŒ‡ๅฎšใ•ใ‚ŒใŸไฝ็ฝฎใ‹ใ‚‰ๆŒ‡ๅฎšๆ–‡ๅญ—ใ‚’ๆŽขใ—ใพใ™ใ€‚

ๆณจๆ„็‚นใฏstart indexใ‚’ๆธกใ—ใฆใ‚‚่ฟ”ใ™ๅ€คใฏๅ…จไฝ“ใฎๆ–‡ๅญ—ๅˆ—ใ‹ใ‚‰ไฝ•็•ช็›ฎใงใ‚ใ‚‹ใจใ„ใ†ๆ•ฐๅญ—ใ‚’่ฟ”ใ—ใพใ™ใ€‚

ๅพŒใ‚ใ‹ใ‚‰ๆคœ็ดขใ™ใ‚‹ใฎใฏlastIndexOfใงใ€ๅพŒใ‚ใ‹ใ‚‰ๆœ€ๅˆใฎๆŒ‡ๅฎšๆ–‡ๅญ—ใฎไฝ็ฝฎใ‚’่ฟ”ใ—ใพใ™ใ€‚

ใ“ใฎๆ™‚ใ‚‚่ฟ”ใ™ๅ€คใฏ้ ญใ‹ใ‚‰ไฝ•็•ช็›ฎใงใ‚ใ‚‹ใจใ„ใ†ๆ•ฐๅญ—ใงใ™ใ€‚

ๆŒ‡ๅฎšๆ–‡ๅญ—ใŒใชใ‘ใ‚Œใฐ-1ใ‚’่ฟ”ใ—ใพใ™ใ€‚

const mySentence = 'Z001-03';

mySentence.indexOf('-');     // 4

mySentence.substring(mySentence.indexOf('-')+1);    // '03'

mySentence.indexOf('D');    // -1

const mySentence = 'Z001-03-02';

mySentence.indexOf('-');    // 4
mySentence.indexOf('-', 5);   // 7

mySentence.lastIndexOf('-')   // 7

testใฏไธ€่ˆฌ็š„ใซๆญฃ่ฆ่กจ็พใจไธ€็ท’ใซไฝฟใ„ใ€ๆธกใ™ๆ–‡ๅญ—ๅˆ—ใจๆฏ”่ผƒใ—ๆœ‰ๅŠนๆ€งใ‚’็ขบ่ชใ—ใพใ™ใ€‚

ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ€ใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใ€็‰นๆฎŠๆ–‡ๅญ—ใ€็”Ÿๅนดๆœˆๆ—ฅใชใฉใฎๅฝขๅผๆคœๆŸปใซไฝฟใˆใพใ™ใ€‚

const mySentence = /a/;
const myWord = 'baby';

mySentence.test(myWord);   // true

/\d/.test('cookie');       // false \dใฏๆ•ฐๅญ—ใ‚’ๆ„ๅ‘ณ(ๆญฃ่ฆ่กจ็พ)
/\d/.test('cookie1');      // true

ไธŠใฎไพ‹ไปฅๅค–ใซใ‚‚ๅฑฑใปใฉใƒกใ‚ฝใƒƒใƒ‰ใŒๅคšใ„ใ—ใ€ใพใŸๆ–ฐใ—ใไฝœใ‚‰ใ‚Œใ‚‹ใƒกใ‚ฝใƒƒใƒ‰ใ‚‚ใŸใใ•ใ‚“ใ‚ใ‚Šใพใ™ใญใ€‚

ใพใŸๅฟ…่ฆใชๆฉŸ่ƒฝใฎใƒกใ‚ฝใƒƒใƒ‰ใŒใ‚ใ‚Œใฐ็ขบ่ชใ—ใฆใ„ใใพใ—ใ‚‡๏ผ

ใ‚ใ–ใƒผใ™๏ผ

Moment.js, A Simple Tool For Calculating Date And Time(feat.Nodejs)

Easy way to calculate date and time way better

Sometimes we need to calculate date and time.

Actually more than sometimes.

And this library, moment.js, is so powerful for your purpose.

Getting date, setting a date format whatsoever you want, subtracting date from date, counting days, and others.

Below listed some functions for your quick use.

Let’s dig it.


Install moment.js

Install library with below command.

npm install moment

Import the library with ‘require’ function.

var moment = require('moment');
moment();

//ES6 syntax
import moment from 'moment';
moment();

Let’s get started from parsing date.

const date = moment(""); //2022-01-23T11:15:00+09:00

We can display date using format() method with below tokens.

tokenmeanexample
YY(YY) year ex) YYYY -> 2022, YY -> 22
MM(MM) monthex) MMMM -> January, MM -> 01
DD dateex) DD -> 25
dd(dd) dayex) dd -> Tu, dddd -> Tuesday
hhhour(12)ex) hh -> 01
HH hour(24)ex) HH -> 13
mm minuteex) mm -> 07
sssecondex) ss -> 03
a am, pmex) a -> pm
Do ordinalex) Do -> 25th
//January Tu 2022, 01:07:21 pm
moment.format('MMMM dd YYYY, hh:mm:ss a'); 

//January Tuesday 2022, pm 01:17
moment.format('MMMM dddd YYYY, a hh:mm') 

// 01/25/2022
moment.format('MM/DD/YYYY'); 

isValid() method works well on it.

moment('2022-01-25','YYYY-MM-DD').isValid(); //true

moment('2022-02-30','YYYY-MM-DD').isValid(); //false

moment('My birth is 2022-1-25','YYYY-MM-DD').isValid(); //true

Also parsing every detail date is available by intuitive methods.

hour()get hour
minute()get minute
second()get second
millisecond()get millisecond
date()get date (1~31)
day()get day of week (0~6)
week()get week of year (1~53)
month()get month (0~11)
year()get year
moment(new Date).hour(); //13

moment().millisecond(); //331

moment().week(); //5

To get the difference in date, use diff() method.

const theDate = moment('2021-01-20', 'YYYY-MM-DD');
const myDate = moment('2022-01-25', 'YYYY-MM-DD');

myDate.diff(theDate, 'days');     // 5
myDate.diff(theDate, 'year');    // 1
myDate.diff(theDate, 'month');  // 12

We can use this method for counting expire date or calculate D-day.

And there is a bunch of methods this library thanks to the last long maintenance till today.

Please check official web for further infomation.

momentjs.com

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์žฌ๊ท€๋กœ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ(feat.๋ฉ”๋ชจ์ด์ œ์ด์…˜)

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

0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋ฉด,

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181…….์™€ ๊ฐ™์ด ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š”๋ฐ์š”.

๋ฐ”๋กœ ์•ž(n-1)์˜ ์ˆ˜์™€ ๊ทธ ๋ฐ”๋กœ ์•ž(n-2)์˜ ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด ํ˜„์žฌ์˜ ์ˆ˜(n)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ทธ๋ฆผ์€ ๋„ค๋ชจ์นธ ์ฑ„์šฐ๊ธฐ๋กœ ํ•œ ๋ฉด์˜ ๊ธธ์ด๊ฐ€ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๊ฐ™์ด ์ฆ๊ฐ€๋ฅผ ๋ณด์ด๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜:https://en.wikipedia.org/wiki/Fibonacci_number

์‚ฌ๊ฐํ˜•์ด 1/4์”ฉ ํšŒ์ „ํ•˜๋ฉฐ ๊ทธ๋ฆฌ๋Š” ๋‚˜์„ ํ˜•์€ ํ™ฉ๊ธˆ ๋น„์œจ(1.618)์— ์ˆ˜๋ ดํ•˜์—ฌ ๊ณผํ•™์ ์ด๋ฉฐ ์˜ˆ์ˆ ์ ์ธ ๋น„์œจ์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

https://en.wikipedia.org/wiki/Fibonacci_number

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

const fibonacci = (n) => {

  if ( n <= 1 ) {
    return n;
  }
  
  return fibonacci(n-1) + fibonacci(n-2);
}

์œ„ ํ•จ์ˆ˜๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๊ณ„์‚ฐ ์–‘์ด ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๊ณ„์‚ฐ์˜ ์ค‘๋ณต ๋ฌธ์ œ ๋•Œ๋ฌธ์ธ๋ฐ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด fibonacci(10)์„ ์‹คํ–‰ํ•˜๋ฉด fibonacci(9), fibonacci(8), fibonacci(7)……. ์ˆœ์„œ๋กœ ์‹คํ–‰์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”.

fibonacci(9)๋Š” ๋‹ค์‹œ fibonacci(8), fibonacci(7), fibonacci(6)…. ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ด๋ฏธ ํ•œ ๊ณ„์‚ฐ์„ ํ•˜๊ณ  ๋˜ ํ•˜๊ณ  ๋˜ ํ•˜๊ณ … ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด๋กœ ์ €์žฅํ•ด๋‘๊ณ  ๊ฑฐ๊ธฐ์„œ ๊ฐ’์„ ๊บผ๋‚ด์“ฐ๋ฉด ๊ณ„์‚ฐ์˜ ์ค‘๋ณต์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํšจ์œจ์ ์ด๊ณ  ์•„๋ฆ„๋‹ค์šด ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ์š”.

๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const fibo = (num, memo) => {

      memo = memo || {}

      if(memo[num]){
          return memo[num]
      }

      if(num<=1){
          return num;
      }

      return fibo(num-1, memo) + fibo(num-2, memo);

}

๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ํšจ์œจ์ ์œผ๋กœ ํ”ผ๋ณด๋‚˜์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


setState & useState, ์™œ ๋น„๋™๊ธฐ์ผ๊นŒ?(ํƒ๊ตฌ์ผ๊ธฐ, ๋ฆฌ์•กํŠธReact)

setState, useState๋ฅผ ๋™๊ธฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฆฌ์•กํŠธ(React)์˜ state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” state๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” useState ํ›…(ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋Š” ๋™์ž‘ X)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‘๊ณ  ์™œ state๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ๊ด€๋ฆฌํ• ๊นŒ์š”?

์ด๋Š” state๊ฐ€ ๊ฐ–๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์ธ๋ฐ์š”. ๋ฐ”๋กœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง(Re-rendering)์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ’์ด ๋ณ€ํ™”ํ•จ์— ๋”ฐ๋ผ ์‹ค์‹œ๊ฐ„(!!!)์œผ๋กœ ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋˜๊ณ  ๋ณ€ํ™”๋œ ๊ฐ’์ด ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๋ฆฌ์•กํŠธ๋„ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ’์˜ ๋ณ€๊ฒฝ์€ ๋ฆฌ์•กํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ
class MyClass extends React.Component {
  constructor(props) {
    super(props);
    //state
    this.state = {
      cnt: 0  //์ดˆ๊ธฐํ™” 0
    };
  }

updateState = () => {
  this.setState({ cnt: this.state.cnt + 1 });
}

render() {
    return (
      <div>
        <p>๊ฐ’:{this.state.cnt}</p> 
        <button onClick={this.updateState}>plus</button>
      </div>
    );
  }
}
//ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ
import React, { useState } from 'react';

const MyFunc = () => {
  //useState ํ›…์„ ํ†ตํ•ด state ์‚ฌ์šฉ
  const [cnt, setCnt] = useState(0); //์ดˆ๊ธฐํ™” 0

const plusNum = () => {
   setCnt( cnt+1 );
}

return(
    <div>
       <p>๊ฐ’:{cnt}</p>
       {/* ํ›…์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ */}
       <button onClick={plusNum}>plus</button>
    </div>
  )
}

ํด๋ž˜์Šคํ˜• ๋˜๋Š” ํ•จ์ˆ˜ํ˜•์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์นœ๊ตฌ๊ฐ€ ๋œน๋‹ˆ๋‹ค.

plus๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ฐ’์ด 1์”ฉ ํ”Œ๋Ÿฌ์Šค ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–จ๊นŒ์š”?

const plusNum = () => {
   setCnt(cnt+1);
   console.log('result:'+cnt);
}

์˜๋„ํ•œ ๊ฒƒ์€ state์— cnt+1์˜ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์ƒˆ๋กœ ์„ค์ •๋œ ๊ฐ’์„ ๋ฐ”๋กœ ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ธ๋ฐ์š”. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”์ฐฝ์˜ ๊ฒฐ๊ณผ๋Š” ํ•œ ๊ฑธ์Œ ๋Šฆ์Šต๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?

๋ฐ”๋กœ ๋น„๋™๊ธฐ(Asynchronous)์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์ธ๋ฐ์š”.


1. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ

๋™๊ธฐ(Synchronous) – ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ.

๋น„๋™๊ธฐ(Asynchronous) – ์ˆœ์„œ๊ฐ€ ์•„๋‹Œ ์ด๋ฒคํŠธ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ.

์งฑ๊ตฌ์˜ ์ผ์ƒ์„ ํ†ตํ•ด ๋™๊ธฐ ์ž‘์—…์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์—„๋งˆ : “์งฑ๊ตฌ์•ผ! ์•ก์…˜๋ถ„์‹ ๊ฐ€์„œ ๋–ก๋ณถ์ด 3์ธ๋ถ„๋งŒ ํฌ์žฅํ•ด ์˜ค๊ฒ ๋‹ˆ? ์ง‘์— ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ฆ‡์— ์˜ฎ๊ฒจ ๋‹ด๊ณ  ์—„๋งˆ๋ฅผ ๋ถˆ๋Ÿฌ!”

์งฑ๊ตฌ ํ”„๋กœ์„ธ์Šค๋Š” 1.๋–ก๋ณถ์ด๋ฅผ ์‚ฌ๋Ÿฌ ๋‚˜๊ฐ€์„œ 2.์ฃผ๋ฌธ์„ ํ•˜๊ณ  3.์ง‘์— ๋“ค๊ณ  ์™€์„œ 4.๋‹ค์‹œ ๊ทธ๋ฆ‡์— ๋‹ด๊ณ  5.์—„๋งˆ๋ฅผ ๋ถ€๋ฅด๋Š” ๊ณผ์ •์ด ๋ชจ๋‘ ์ˆœ์„œ๋Œ€๋กœ ๋™๊ธฐ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ ๋งŽ์€ ์งฑ๊ตฌ๋Š” ์—„๋งˆ ๋ง์„ ์ž˜ ๋“ค์„๋ฆฌ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ์š”..

๊ทธ๋ ‡๋‹ค๋ฉด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œํ‚ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

๋น„๋™๊ธฐ ์—„๋งˆ : “์งฑ๊ตฌ์•ผ! ์•ก์…˜๋ถ„์‹ ๋–ก๋ณถ์ด 2์ธ๋ถ„์ด๋ž‘ ์ตธ์ฝ”๋น„๋ฐ˜์  ์งฌ๋ฝ• ๋‘๊ฐœ๋ฅผ ๋ฐฐ๋‹ฌ ์‹œ์ผœ์„œ ๋„์ฐฉํ•˜๋ฉด ๊ฐ์ž ๊ทธ๋ฆ‡์— ์˜ฎ๊ฒจ ๋‹ด์•„์ค˜! ๋ฐฐ๋‹ฌ์ด ์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ฐฉ์— ์žฅ๋‚œ๊ฐ ์ข€ ์น˜์›Œ์ฃผ๋ฉด ์ดˆ์ฝ”๋น„๋ฅผ ์ค„์ง€๋„ ๋ชฐ๋ผ~!”

์ž‘์—…์„ ๊ฐ๊ฐ ์š”์ฒญํ•˜๊ณ , ์š”์ฒญํ•œ ์ž‘์—…์ด ๊ฐ€๊ฒŒ์—์„œ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์งฑ๊ตฌ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์งฑ๊ตฌ๊ฐ€ ๋ฐฐ๋‹ฌ ์ฃผ๋ฌธ(์ž‘์—… ์š”์ฒญ)์„ ํ•˜๊ณ  ๋„์ฐฉํ•˜๊ธฐ ์ „๊นŒ์ง€(์š”์ฒญ ์ฒ˜๋ฆฌ์ค‘)๋Š” ์žฅ๋‚œ๊ฐ ์น˜์šฐ๊ธฐ(๋‹ค๋ฅธ ์ž‘์—…)๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๋ฐฐ๋‹ฌ์ด ์™„๋ฃŒ(์š”์ฒญ ์ž‘์—… ์™„๋ฃŒ)๋˜๋ฉด ๋‹ค์‹œ ๊ทธ๋ฆ‡์— ์˜ฎ๊ฒจ ๋‹ด๋Š”(์š”์ฒญ ๊ด€๋ จ ์ž‘์—… ์ง„ํ–‰) ์‹์ž…๋‹ˆ๋‹ค.


2. ๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„ ์ƒ˜ํ”Œ์—์„œ ์ฝ˜์†” ์ถœ๋ ฅ์ด ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

์—ฌ๋Ÿฌ ๊ธ€๊ณผ ๋ฌธ๋‹ต์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋‚ด๋ฆฐ ๊ฒฐ๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํŠน์„ฑ์„ ๊ฐ–๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด setCnt ์ž‘์—…์€ ๋’ค๋กœ ๋ฐ€๋ฆฌ๊ณ  console.log์ž‘์—…์ด ๋จผ์ € ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const printSequence = () => {
    console.log('first Call');
    setTimeout(()=>{secondCall()},0)
    console.log('third Call');
}

const secondCall = () => {
    console.log('second Call');
}

์ฝ˜์†”์ฐฝ์˜ ๊ฒฐ๊ณผ๋Š”์š”.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค์ด๋ฏ€๋กœ ๋™๊ธฐ๋กœ ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ์ž‘์—… ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€Œ๋Š” ์ด์œ ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋ผ๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ์†์— ์˜ํ•ด ๋น„๋™๊ธฐ๋กœ ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด setTimeout์„ ํ†ตํ•ด console.log ์ž‘์—… ์‹œ๊ฐ„์„ ๋’ค๋กœ ์—ฐ๊ธฐํ•˜๋ฉด ์ž‘์—…์ด ๋๋‚œ ๋’ค ๋กœ๊ทธ๋ฅผ ์ฐ์„ ํ…Œ๋‹ˆ ๊ฐ’์ด ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์„๊นŒ์š”?

  const showAlert = () => {
    setCnt(cnt+1);
    setTimeout(()=>{
      console.log('result(3sec):'+cnt)}
    ,3000);
 }

plus๋ฅผ ๋‹ค์„ฏ๋ฒˆ ๋ˆ„๋ฅธ ๊ฐ๊ฐ์˜ ๊ฒฐ๊ณผ๋Š”์š”.

๊ฐ’์„ 5๊นŒ์ง€ ์ฐ์—ˆ์œผ๋‹ˆ ์ฝ˜์†”๋„ 5๊นŒ์ง€ ์ฐํ˜€์•ผ ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ์ „์˜ ๊ฐ’์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋ฐ”๋กœ setTimeout ํ•จ์ˆ˜์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์ธ๋ฐ์š”.

setTimeout ํ•จ์ˆ˜๋Š” ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉฐ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๊ฐ’์€ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ „๋‹ฌํ•˜๋Š” ์‹œ์ ์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’(์ƒ์ˆ˜)์ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ 3์ดˆ๊ฐ€ ์•„๋‹Œ 1000์ดˆ ๋’ค์— ์‹คํ–‰ํ•˜๋”๋ผ๋„ ์‹คํ–‰๋˜๋Š” ๊ฐ’์€ ์ „๋‹ฌํ•˜๋Š” ์‹œ์ ์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ์š”?

state ์„ค์ • ์‹œ ํด๋ž˜์Šคํ˜•์€ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ•จ์ˆ˜ํ˜•์€ useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 //ํด๋ž˜์Šคํ˜•
 updateState = () => {
    this.setState(
      { cnt: this.state.cnt + 1 },
      ()=>{ console.log(this.state.cnt) }
    )
 }


 //ํ•จ์ˆ˜ํ˜•
 const plusNum = () => {
    setCnt(cnt+1);
 }

 useEffect(()=>{
  console.log(cnt);
 },[cnt])

์ด์ œ ์˜๋„ํ•œ ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.


3. ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋Š” ์ด์œ 

๊ทธ๋ ‡๋‹ค๋ฉด state ์„ค์ •์€ ์™œ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ• ๊นŒ์š”?

์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ state๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ์š”.

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

๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’๋“ค์„ ๋ชจ์•„ ํ•œ๋ฒˆ์— ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ค„์ด๊ณ ์ž ๋ฐฐ์น˜(Batch) ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ๋ฐฐ์น˜ ์—…๋ฐ์ดํŠธ๋Š” 16ms ์ฃผ๊ธฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค!


18 ๋ฒ„์ „์—์„œ ์ถ”๊ฐ€๋  ์ž๋™๋ฐฐ์น˜(Automatic Batching)๋Š” ๊ธฐ์กด์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ๋งŒ ์‹คํ–‰๋˜๋˜ ๋ฐฐ์น˜๊ฐ€ ์ด์ œ๋Š” setTimeout, Promise ๋“ฑ์˜ ์ด๋ฒคํŠธ์—์„œ๋„ ๋™์ž‘๋  ์˜ˆ์ •์ด๋ฉฐ, flushSync() ๋“ฑ์„ ์‚ฌ์šฉํ•ด ์˜ˆ์™ธ๋ฅผ ๋‘˜ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•˜์—ฌ ๋งŽ์€ ๊ธฐ๋Œ€๋ฅผ ๋ฐ›๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ฏธ๋ฆฌ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž๋™๋ฐฐ์น˜ ๊ด€๋ จํ•œ ์ƒ์„ธ ์„ค๋ช…(์˜์–ด)

์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ปค๋ง(Currying) ๊ธฐ๋ฒ• ์ดํ•ดํ•˜๊ธฐ(feat.์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)

์ปค๋ง(Currying) ๊ธฐ๋ฒ•์˜ ์ดํ•ด์™€ ์‚ฌ์šฉ, ๊ทธ๋ฆฌ๊ณ  ์žฅ๋‹จ์ 

์ปค๋ง(Currying)์€ ์นด๋ ˆ์™€ ๊ฐ™์€ ์ŠคํŽ ๋ง์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ ๊ทธ ์œ ๋ช…ํ•œ ํ•˜์Šค์ผˆ(Haskell)์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ถœ์ฒ˜์ธ ์ˆ˜ํ•™&๋…ผ๋ฆฌํ•™์ž ํ•˜์Šค์ผˆ ๋ธŒ๋ฃฉ์Šค ์ปค๋ฆฌ(Haskell Brooks Curry)์˜ ์„ฑ(Family Name)์ž…๋‹ˆ๋‹ค.

์ปค๋ง์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(Parameter)๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ๊ฐ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

์‹์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func(a, b, c) -> f(a)(b)(c)

์œ„ ์‹์„ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด์„œ ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ๋˜ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

//non-curried
function plusFunc(a, b, c){
  console.log(a + b + c);
}

plusFunc(1, 2, 3);   // 6

//curried
function plusFunc(a){
    return function(b){
       return function(c){
          console.log(a + b + c);
       }
    }
}

plusFunc(1)(2)(4);  // 7

๋…ผ์ปค๋ฆฌ์™€ ์ปค๋ฆฌ์˜ ์ฐจ์ด๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

non-curried : ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ชจ์ž๋ผ๋„ ๋ฌธ์ œ ์—†์ด ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•จ
๐Ÿ‘‰ ํ•จ์ˆ˜ ์ •์˜ : func(a, b, c)
๐Ÿ‘‰ ํ•จ์ˆ˜ ์‹คํ–‰ : func(a)
๐Ÿ‘‰ ์‹คํ–‰ ๊ฒฐ๊ณผ : func(a, undefined, undefined)

curried : ํ•จ์ˆ˜๊ฐ€ ์ธ์ˆ˜๋ฅผ ์ „๋ถ€ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ์‹คํ–‰์„ ๋ณด๋ฅ˜ํ•จ.
๐Ÿ‘‰ ํ•จ์ˆ˜ ์ •์˜ : func(a, b, c)
๐Ÿ‘‰ ํ•จ์ˆ˜ ์‹คํ–‰ : func(a)
๐Ÿ‘‰ ์‹คํ–‰ ๊ฒฐ๊ณผ : func(a)์ƒํƒœ์—์„œ b ํ•จ์ˆ˜ ์ž…๋ ฅ ๋Œ€๊ธฐ

์œ„ ํŠน์ง•์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function setAppell(appell){
    return function(name) {
       console.log(appell + name);   
    }
}

const setName = setAppell('Mr.');
setName('Right');  // Mr.Right
setAppell('Mr.')('Baker'); //Mr.Baker

//ES6 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
const setAppell = appell => name => console.log(appell + name);

const setName = setAppell('Miss.');
setName('Dior');  // Miss.Dior

๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฒคํŠธ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋™์‹œ์— ์ „๋‹ฌํ•  ๋•Œ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

const setNumber = (num) => (event) => {
     console.log(event.target.id+':'+num);
}

<div onClick="setNumber(2)(event)" id='myNum'>
  click
</div>

// myNum:2

๊ทธ๋Ÿผ ์ปค๋ง์˜ ์žฅ์ ์„ ์š”์•ฝํ•˜๋ฉด ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

์žฅ์ ๐Ÿ‘
์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
– ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ(์ฝ”๋“œ ์–‘ ๊ฐ์†Œ)
– ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

๊ทธ๋ ‡๋‹ค๋ฉด ์ปค๋ง์˜ ๋‹จ์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋‹จ์ ๐Ÿ‘Ž
– ํ•จ์ˆ˜๊ฐ€ ๊นŠ์ด ๊นŠ์ด ์ค‘์ฒฉ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋‹คํ•˜๊ฒŒ ์ ์œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋งฅ๋ฝ์—์„œ ์ปค๋ง์„ ๊ณผ์šฉํ•˜๋ฉด
๋ฉ”๋ชจ๋ฆฌ์™€ ์†๋„์— ๋ฌธ์ œ์  ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ

์ปค๋ง์˜ ์ˆ˜ํ•™์ ์ธ ์„ค๋ช…์ด ํ•„์š”ํ•˜์‹  ๋ถ„์„ ์œ„ํ•œ ๋งํฌ



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

target๊ณผ currentTarget, ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ?(feat.์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)

target๊ณผ currentTarget์„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ target๊ณผ currentTarget์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์š”์†Œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ target๊ณผ currentTarget์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

1. target๊ณผ currentTarget

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด target์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฐ”๋กœ ๊ทธ ์š”์†Œ๋ฅผ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ค๊ณ  currentTarget์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(EventListener)๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

‘๋ฐฑ๋ฌธ๋ถˆ์—ฌ์ผ์ฝ”๋“œ(็™พ่ž๏ฅงๅฆ‚ไธ€code)’์ด๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<style>
  .upper{
    background:gold;
    width:80px;
    text-align:center;
  } 
  .lower{
    background:pink;
    width:50px;
  }
</style>

<script>
  function clicked(event){
    alert(event.target.id+" clicked");
  }
</script>

<div class="upper" onClick="clicked(event)" id="div">
  <span class="lower" id="span">                  
    span
  </span>
</div>

์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋…ธ๋ž‘์€ div, ํ•‘ํฌ๋Š” span์ด๋ฉฐ, ํ•‘ํฌ๊ฐ€ ๋…ธ๋ž€์ƒ‰ ์œ„์— ์•‰์•„์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ onClick ์ด๋ฒคํŠธ๋Š” div์—์„œ ์„ค์ •ํ–ˆ์ง€๋งŒ ๋…ธ๋ž‘์„ ๋ˆŒ๋Ÿฌ๋„, ํ•‘ํฌ๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ๋ชจ๋‘ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

div์—๋งŒ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ–ˆ๋Š”๋ฐ ์™œ ์ž์‹์ธ span๋„ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์† ๋ฐ›๋Š” ๊ฒƒ์ผ๊นŒ์š”?

์ด๋Š” ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์ด๋ฒคํŠธ ์บก์ณ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ, ๊ด€๋ จ ๋‚ด์šฉ์€ ์•„๋ž˜ ํฌ์ŠคํŠธ์—์„œ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์ด๋ฒคํŠธ ์บก์ณ ํฌ์ŠคํŠธ

์ด๋ฒคํŠธ ๋ฐœ์ƒ์— ๋”ฐ๋ฅธ target์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

– ํ•‘ํฌ ๋ถ€๋ถ„์„ ํด๋ฆญ
target -> ํ•‘ํฌ (ํ•‘ํฌ๋ฅผ ๋ˆŒ๋ €์œผ๋ฏ€๋กœ ํ•‘ํฌ๊ฐ€ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์ด ๋จ)
currentTarget -> ๋…ธ๋ž‘ (onClick ์ด๋ฒคํŠธ๋Š” ๋…ธ๋ž‘์ด ๊ฐ–๊ณ  ์žˆ์Œ)

๋…ธ๋ž€ ๋ถ€๋ถ„์„ ํด๋ฆญ
target -> ๋…ธ๋ž‘(๋…ธ๋ž‘์„ ๋ˆŒ๋ €์œผ๋ฏ€๋กœ ๋…ธ๋ž‘์ด ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์ด ๋จ)
currentTarget -> ๋…ธ๋ž‘(onClick ์ด๋ฒคํŠธ๋Š” ๋…ธ๋ž‘์ด ๊ฐ–๊ณ  ์žˆ์Œ)

๋”ฐ๋ผ์„œ ๋…ธ๋ž‘์„ ๋ˆ„๋ฅด๋ฉด ‘div clicked’, ํ•‘ํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ‘span clicked’ ์•Œ๋ฆผ์ฐฝ์„ ๋„์›๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํ•‘ํฌ๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋ž‘์˜ ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด currentTarget๊ณผ getAttribute๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<style>
  .upper{
    background:gold;
    width:80px;
    text-align:center;
  } 
  .lower{
    background:pink;
    width:50px;
  }
</style>

<script>
  function clicked(event){
    alert(event.currentTarget.getAttribute('id')+" clicked");
  }
</script>

<div class="upper" onClick="clicked(event)" id="div">
  <span class="lower" id="span">                  
    span
  </span>
</div>

์œ„ ์ฝ”๋“œ๋Š” ํ•‘ํฌ, ๋…ธ๋ž‘ ๋‘˜ ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋ž‘ ์†์„ฑ์—๋งŒ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

target์€ ๋ˆ„๋ฅธ ๋ฐ”๋กœ ๊ทธ ๊ฒƒ, currentTarget์€ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ”๋กœ ๊ทธ ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.



target๊ณผ currentTarget๋Š”์ด๋ฒคํŠธํ•ธ๋“ค๋ง๊ณผ ์ด๋ฒคํŠธ ์บก์ณ์™€ ํ•จ๊ป˜ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ๊ด€๋ จํ•˜์—ฌ ์ค‘์š”ํ•œ ์†์„ฑ๊ณผ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๋ฐฑ๋ฌธ๋ถˆ์—ฌ์ผ์ฝ”๋“œ(code)์ด๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ณ  ์—ฐ์Šตํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด๋ฉด ์–ด์ œ์˜ ์ •๋ณด๊ฐ€ ๋‚ด์ผ์˜ ๋‚˜์˜ ๋ฌด๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์ด๋ฒคํŠธ ์บก์ณ, ์ด์ œ๋Š” ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์ž(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)

์ด๋ฒคํŠธ๋ฒ„๋ธ”๋ง๊ณผ ์ด๋ฒคํŠธ์บก์ณ, ๊ฐœ๋…๊ณผ ํ™œ์šฉ

1. ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง

(์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ ๊ฑฐํ’ˆ์ด ํํํํ ์ผ์–ด๋‚˜๋“ฏ์ด ์ด๋ฒคํŠธ๊ฐ€ ํํํํ ์ผ์–ด๋‚˜ ‘๋ฒ„๋ธ”๋ง(Bubbling)’์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ๊ธ€์„ ์–ด๋””์„ ๊ฐ€ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค..)

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์š”์†Œ์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ์š”์†Œ๊นŒ์ง€ ํํํํ ์ด๋ฒคํŠธ๊ฐ€ ์—ฐ๋‹ฌ์•„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<style>
  .upper{
    background:gold;
    width:70px;
    text-align:center;
  } 
  .middle{
    background:orange;
    width:50px;
    text-align:center;
  }
  .lower{
    background:pink;
    width:30px;
  }
</style>

<script>
  function clicked(event){
    alert(event.currentTarget.getAttribute('id'));
  }
</script>

<div class="upper" onClick="clicked(event)" id="์Œ‰">a
  <div class="middle" onClick="clicked(event)" id="๊ฐ€">b
    <div class="lower" onClick="clicked(event)" id="๋Šฅ">c
    </div>
  </div>
  
</div>

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๋‚ด๋ถ€์— ์ž๋ฆฌ ์žก๊ณ  ์žˆ๋Š” c๋ฅผ ํด๋ฆญํ•˜๋ฉด ์–ด๋–ค ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋ ๊นŒ์š”?

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ด default๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ c, b, a์˜ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์œ„ ์ฝ”๋“œ๋ผ๋ฉด ‘๋Šฅ’ -> ‘๊ฐ€’ -> ‘์Œ‰’ ์˜ ์ˆœ์„œ๋Œ€๋กœ ์•Œ๋ฆผ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค.

b๋ฅผ ํด๋ฆญํ•˜๋ฉด ‘๊ฐ€’ -> ‘์Œ‰’ ์˜ ์ˆœ์„œ๋กœ ์•Œ๋ฆผ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ˆœ์„œ๋ฅผ ‘์Œ‰’ -> ‘๊ฐ€’ -> ‘๋Šฅ’ ์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ๋ฐ”๋กœ ์ด๋ฒคํŠธ ์บก์ณ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2. ์ด๋ฒคํŠธ ์บก์ณ

์ด๋ฒคํŠธ ์บก์ณ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด addEventListener ๋‚ด๋ถ€์— capture ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ true๋กœ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ false์ด๋ฉฐ, false๋Š” ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง, true๋Š” ์ด๋ฒคํŠธ ์บก์ณ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

function clicked(event){
    alert(event.currentTarget.getAttribute('id'));
}

const divs = document.querySelectorAll('div');
divs.forEach(function(div) {
	div.addEventListener('click', clicked,{
  	capture:true
  }
  );
});  

<div class="upper" id="์Œ‰">a
  <div class="middle" id="๊ฐ€">b
    <div class="lower" id="๋Šฅ">c
    </div>
  </div>
</div>

์œ„ ์ฝ”๋“œ์—์„œ capture:true๋กœ ์„ค์ •ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ c๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ด๋ฒˆ์—๋Š” ๋ฐ˜๋Œ€ ์ˆœ์„œ์ธ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ๋Š” ‘์Œ‰’ -> ‘๊ฐ€’ -> ‘๋Šฅ’ ์˜ ์ˆœ์„œ๋กœ ์•Œ๋ฆผ์ด ๋œน๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ‘์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๋„ ์‹ซ๊ณ , ์ด๋ฒคํŠธ ์บก์ณ๋„ ์‹ซ์œผ๋‹ˆ ๋‘˜ ๋‹ค ํ•˜์ง€๋งˆ!’๋ผ๊ณ  ๋ช…๋ นํ•  ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜ ์‹คํ–‰๋  ํ•จ์ˆ˜ ๋‚ด๋ถ€์— event.stopPropagation()์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ๊ฐ„๋‹ค(propaganda)๋ฅผ ๋‹ฎ์€ ๊ทธ ๋‹จ์–ด ‘propagation’์€ ‘๋ฒˆ์‹, ์ฆ์‹, ์ „ํŒŒ’๋“ฑ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ‘์ด๋ฒคํŠธ์˜ ์ฆ์‹ ๋˜๋Š” ์ „ํŒŒ๋ฅผ ๋ฉˆ์ถ”๊ฒ ๋‹ค’๋Š” ์˜๋ฏธ๋กœ event.stopPropagation() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<style>
  .upper{
    background:gold;
    width:70px;
    text-align:center;
  } 
  .middle{
    background:orange;
    width:50px;
    text-align:center;
  }
  .lower{
    background:pink;
    width:30px;
  }
</style>

<script>
  function clicked(event){
    event.stopPropagation();
    alert(event.currentTarget.getAttribute('id'));
  }
</script>

<div class="upper" onClick="clicked(event)" id="์Œ‰">a
  <div class="middle" onClick="clicked(event)" id="๊ฐ€">b
    <div class="lower" onClick="clicked(event)" id="๋Šฅ">c
    </div>
  </div>
  
</div>

์œ„ ๋ฉ”์„œ๋“œ๋Š” ๋” ์ด์ƒ ‘์Œ‰ ๊ฐ€ ๋Šฅ’ ๋˜๋Š” ‘๋Šฅ ๊ฐ€ ์Œ‰’ ๋”ฐ์œ„์˜ ๋‹จ์–ด๋ฅผ ์™„์„ฑํ•˜๋„๋ก ๋‚ด๋ฒ„๋ ค๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

c๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ‘์Œ‰’ ๋˜๋Š” ‘๋Šฅ’๋งŒ ๋„์šธ ๋ฟ์ž…๋‹ˆ๋‹ค.



์ด๋ฒคํŠธํ•ธ๋“ค๋ง๊ณผ ์ด๋ฒคํŠธ ์บก์ณ๋Š” ์˜๋„ํ•œ ๋Œ€๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ์†์„ฑ๊ณผ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์œ„ ๊ฐœ๋…์€ ๋‹ค์Œ ํฌ์ŠคํŠธ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

target, currentTarget ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ?

๋ฐฑ๋ฌธ๋ถˆ์—ฌ์ผ์ฝ”๋“œ(code)์ด๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ณ  ์—ฐ์Šตํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด๋ฉด ์–ด์ œ์˜ ์ •๋ณด๊ฐ€ ๋‚ด์ผ ๋‚˜์˜ ๋ฌด๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ(React) ์ปดํฌ๋„ŒํŠธ, ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ๊ณผ๊ฑฐ์™€ ํ˜„์žฌ(useEffect)

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ์ด๋ฒคํŠธ

1. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ๋ผ์ดํ”„์‚ฌ์ดํด(Life-cycle)

๋ผ์ดํ”„์‚ฌ์ดํด ์ด๋ฒคํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๊ณผ DOM ์ด๋ฒคํŠธ ๋“ฑ์„ ์˜๋„๋Œ€๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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


  • ๋งˆ์šดํŒ…(Mounting) – ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰(์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰)

– constructor()

UNSAFE_componentWillMount() -> version 17๋ถ€ํ„ฐ ๊ณต์‹์ ์œผ๋กœ ๊ถŒ์žฅX

render()

– componentDidMount()

  • ์—…๋ฐ์ดํŠธ(Update) – props ๋˜๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰

UNSAFE_componentWillReceiveProps() -> ๊ถŒ์žฅX

UNSAFE_componentWillUpdate() -> ๊ถŒ์žฅX

render()

– componentDidUpdate(prevProps, prevState, snapshot)

  • ์–ธ๋งˆ์šดํŒ…(Unmounting) – ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰

– componentWillUnmount()


์œ„์™€ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” [ ๋งˆ์šดํŒ… -> ์—…๋ฐ์ดํŠธ(๋ฐ˜๋ณต) -> ์–ธ๋งˆ์šดํŒ… ]์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์ด์ „์—๋Š” ์ง๊ด€์ ์ธ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ(componentWillMount, componentWillReceiveProps, shouldComponentUpdate, componentWillUpdate)๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ๋งˆ๋‹ค ์„ธ์„ธํ•œ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ–ˆ์œผ๋‚˜ ํ˜„์žฌ๋Š” ๋ฒ„๊ทธ๋‚˜ ์•ˆ์ „์„ฑ์˜ ์ด์œ ๋กœ ์ ์  ๋” ๋‹จ์ˆœํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๋Œ€์ฒดํ•˜๋Š” ํ›…(Hook)์ด ๋„ˆ๋ฌด ํŽธํ•ด์„œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ถŒ์žฅ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

class TestList extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      counter:0
    }
  }

  // ๋งˆ์šดํŒ… ์งํ›„ ์‹คํ–‰
  // ๋งˆ์šดํŒ… ์ „ ์‹คํ–‰์€ constructor() ์‚ฌ์šฉ
  componentDidMount(){
     console.log('component Mounted');
  }

  // ์—…๋ฐ์ดํŠธ ํ›„ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ€์ ธ์˜ด
  componentDidUpdate(prevProps) {
     if(prevProps !== this.props) {
            this.setState({counter:++this.state.counter})
     }
  }

  // ์–ธ๋งˆ์šดํŒ… ์ง์ „ ์‹คํ–‰
  componentWillUnmount(){
     console.log('component Unmounted');
  }

  render() {
    return (
      <div>{this.state.counter}</div>
    );
  }
}

๋งˆ์šดํŒ… ์ด๋ฒคํŠธ๋Š” ์‹ค์ œ DOM์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.

๋งˆ์šดํŒ… ์ด๋ฒคํŠธ๋Š” ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์— ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์—…๋ฐ์ดํŠธ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ, props, state ๋“ฑ์˜ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ๋ Œ๋”๋ง ๊ด€๋ จํ•œ ์ž‘์—…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์–ธ๋งˆ์šดํŒ…์€ DOM์—์„œ ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.

์–ธ๋งˆ์šดํŒ… ์ด๋ฒคํŠธ๋Š” ํƒ€์ด๋จธ ์ œ๊ฑฐ, ์š”์†Œ ์ œ๊ฑฐ, ์ด๋ฒคํŠธ ์ œ๊ฑฐ ๋“ฑ ์„ค์ •ํ•œ ์š”์†Œ์˜ ์ •๋ฆฌ, ์ œ๊ฑฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


2. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ useEffect(Hook)

๋ฆฌ์•กํŠธ 16.8๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ํ›…(Hook)์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ state ๋˜๋Š” ๋ฆฌ์•กํŠธ์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ด ์ค‘ useEffect ํ›…์€ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”๋ฐ์š”.

๋ฆฌ์•กํŠธ ๊ณต์‹ ๋ฌธ์„œ์—์„œ useEffect๋ฅผ ์œ„์™€ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰ componentDidMount, componentDidUpdate, componentWillUnmount๋ฅผ ๋ชจ๋‘ ํ•ฉ์ณ ๋†“์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ์ด useEffect์ž…๋‹ˆ๋‹ค.

๋ชจ๋‘ ํ•ฉ์ณ ๋†“์•˜์ง€๋งŒ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ํ•จ์ˆ˜์˜ ์‹œ๊ทธ๋‹ˆ์ณ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์Šต์ด๋ฉฐ, ์ฒซ ๋ฒˆ์งธ๋Š” ์‹คํ–‰ํ•  ํ•จ์ˆ˜, ๋‘ ๋ฒˆ์งธ๋Š” ์กฐ๊ฑด์„ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•˜๋ฉฐ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

useEffect(ํ•จ์ˆ˜, ๋ฐฐ์—ด);

  useEffect(() => {
      console.log('useEffect is working');
  });

– ๋งˆ์šดํŒ…๋งŒ ์„ค์ •(=componentDidMount)

๋งˆ์šดํŒ… ์‹œ์—๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋นˆ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

function testStatus(props) {

  useEffect(() => {
      console.log('useEffect on mounting');
  },[]);

  return <div>test</div>;
}

– ์–ธ๋งˆ์šดํŒ…๋งŒ ์„ค์ •(=componentWillUnmount)

์–ธ๋งˆ์šดํŒ… ์‹œ์—๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด์„œ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋นˆ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

function testStatus(props) {

  useEffect(() => {
      
      console.log('useEffect on mounting');

      return () => {
        console.log('useEffect on unmounting');
      }

  },[]);

  return <div>test</div>;
}

– ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๋งˆ๋‹ค ์„ค์ •(=componentDidUpdate)

useEffect์—์„œ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ Œ๋”๋ง๋งˆ๋‹ค ํ•ด๋‹น ํ›…์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ ๋ฐฐ์—ด์— ์ฒดํฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

function testEffect(props) {

  useEffect(() => {
      console.log('re-rendering');
  });

  useEffect(() => {     
      console.log('props is changed');
  },[props.data]);

  return <div>test</div>;
}


useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ช‡ ๋ฒˆ์˜ ์‹œํ–‰์ฐฉ์˜ค๋งŒ ๊ฑฐ์น˜๋ฉด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์–ด๋А ์ •๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋Œ€ํ•œ ์ดํ•ด ์—†์ด ๊ณ„์† ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋А ์ˆœ๊ฐ„ ‘์‹œ๊ฐ„์„ ๊ฐˆ์•„ ๋„ฃ์–ด ์ง  ์ฝ”๋“œ’๋Š” ์‹œ๊ฐ„ ์•ž์— ๋ฌด๋ฆŽ์„ ๊ฟ‡๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ใ‚ธใƒฃใƒใ‚นใ‚ฏใƒชใƒ—ใƒˆใง้…ๅˆ—ใ‚’็ตๅˆ(ใƒžใƒผใ‚ธ)ใ™ใ‚‹่‰ฏใ„ๆ–นๆณ•(javascript)

้…ๅˆ—ใ‚’็ตๅˆใ™ใ‚‹ไพฟๅˆฉใชไธ‰ใคใฎใ‚„ใ‚Šๆ–น(concat(), โ€ฆspread, push())

ใ‚ธใƒฃใƒใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’ไฝฟใฃใฆใƒ‡ใƒผใ‚ฟใ‚’ๆ‰ฑใ†ใ“ใจใŒๅคšใใชใ‚Šใ€้…ๅˆ—ใ‚’ไฝฟ็”จใ™ใ‚‹ไป•็ต„ใฟใ‚‚ๅข—ใˆใฆใ„ใใพใ™ใ€‚

ใใฎไธญใ€ใƒžใƒผใ‚ธ๏ผˆ็ตๅˆ๏ผ‰ใซใคใ„ใฆใกใ‚‰ใฃใจ่ชฟในใฆใฟใพใ™ใญใ€‚


้…ๅˆ—(array)ใฏใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ๆŒใค่ฆ็ด ใ‚’้ †ใซไธฆในใ‚‹ๆง‹้€ ใงใ™ใ€‚

ไธ€ใคใฎ้…ๅˆ—ใชใ‚‰ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใพใŸใฏใƒกใ‚ฝใƒƒใƒ‰๏ผˆunshift(), push(), shift(), pop(), splice(), find(), includes(), join(), indexOf()ใชใฉ๏ผ‰ใ‚’ไฝฟใฃใฆ้…ๅˆ—ไธญใฎใƒ‡ใƒผใ‚ฟใ‚’ไพฟๅˆฉใซๆ“ไฝœใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

้…ๅˆ—้–“ใฎใƒžใƒผใ‚ธๆ–นๆณ•ใ‚‚ๅŒใ˜ใconcat(), push(), …spreadใชใฉใŒๅญ˜ๅœจใ—ใพใ™ใ€‚

ไธ€ใคใฅใค็ขบ่ชใ—ใฆใฟใพใ™ใ€‚

1. ้…ๅˆ—็ตๅˆใฎไธ‰ใคๆ–นๆณ•

concatenate(้€ฃ็ตใ™ใ‚‹ๆ„ๅ‘ณ)ใฎ็•ฅๅญ—ใงใ‚ใ‚‹concat()ใฏๆ„ๅ‘ณ้€šใ‚Š้…ๅˆ—ไธกๆ–นใ‚’็น‹ใŽใพใ™ใ€‚

ๆฌกใฎใ‚ˆใ†ใซๆ‰ฑใ†ใฎใงใ€ใ‚ตใƒณใƒ—ใƒซใ‹ใ‚‰็ขบ่ชใ—ใฆใฟใพใ™ใ€‚

  • [array1].concat([array2]…..)
  • [].concat([array1], [array2]……)
  • const color1 = ['blue', 'pink', 'white'];
    const color2 = ['black', 'orange', 'yellow'];
    const num1 = [100, 200, 300];
    const num2 = [400, 500, [600, 700]];
    
    const allColor = color1.concat(color2); 
    //['blue', 'pink', 'white', 'black', 'orange', 'yellow']
    console.log(allColor); 
    
    const colorPlus = color1.concat('gold', ['silver', 'bronze']); 
    //['blue', 'pink', 'white', 'gold', 'silver', 'bronze']
    console.log(colorPlus);
    
    const colorAndNum = color1.concat(num1);   
    //['blue', 'pink', 'white', 100, 200, 300]
    console.log(colorAndNum); 
    
    const allNum = num1.concat(num2);   
    //[100, 200, 300, 400, 500, [600, 700]]
    console.log(allNum); 
    

    concatใฏไธ€ใคไปฅไธŠใฎ้…ๅˆ—ใ‚’็ตๅˆใ—ใ€ไธ€ใคใฎ้…ๅˆ—ใซใ—ใพใ™ใ€‚

    ้…ๅˆ—ไธญใฎใƒ‡ใƒผใ‚ฟใฎๅฝขๅผ๏ผˆใ‚ฟใ‚คใƒ—๏ผ‰ใซใ‹ใ‹ใ‚ใ‚‰ใš็ตๅˆใงใใ‚‹ใ—ใ€ใƒใ‚นใƒˆใ•ใ‚Œใฆใ„ใ‚‹้…ๅˆ—๏ผˆ้…ๅˆ—ไธญใซใพใŸ้…ๅˆ—ใŒใ‚ใ‚‹ๆง‹้€ ๏ผ‰ใฎ็ตๅˆใ‚‚ใงใใพใ™ใ€‚


    ES6ใ‹ใ‚‰่ฟฝๅŠ ใ•ใ‚ŒใŸๆ–‡ๆณ•ใฎไธ€ใคใงใ‚ใ‚‹ใ‚นใƒ—ใƒฌใƒƒใƒ‰ๆง‹ๆ–‡ใฏ้…ๅˆ—ๆˆ–ใฏใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’้€Ÿใใฆๅฎ‰ๅ…จใซใ‚ณใƒ”ใƒผใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

    ๆทฑใ„ใ‚ณใƒ”ใƒผ(deep copy)ๆ–นๆณ•ใงใ‚ณใƒ”ใƒผใ™ใ‚‹ใฎใงใ€ๆ—ขๅญ˜ใฎใƒ‡ใƒผใ‚ฟใจใฏ้•ใ†ใƒกใƒขใƒชใƒผใ‚ขใƒ‰ใƒฌใ‚นใ‚’ไฝฟใ„ใพใ™ใญใ€‚

    ใชใฎใง้…ๅˆ—ใฎ็ตๅˆๆ–นๆณ•ใฎไธญใงใฏไธ€็•ชใ„ใ„ๆ–นๆณ•ใ ใจ่จ€ใˆใพใ™ใ€‚

    const musician = ['Chet Baker', 'Miles Davis'];
    const actor = ['Clint Eastwood', 'George Clooney'];
    
    const favorites = [...musician, ...actor];    
    // ['Chet Baker', 'Miles Davis', 'Clint Eastwood', 'George Clooney'];
    console.log(favorites); 
    
    const favoritesReverse = [...actor, ...musician];
    // ['Clint Eastwood', 'George Clooney', 'Chet Baker', 'Miles Davis'];
    console.log(favoritesReverse)
    
    

    ใพใŸใ€ใ‚นใƒ—ใƒฌใƒƒใƒ‰ๆง‹ๆ–‡ใฏๆฌกใฎใ‚ˆใ†ใซ้žๆง‹้€ ๅŒ–ใงใฏใ‚ˆใใคใ‹ใ‚ใ‚Œใฆใ„ใพใ™ใ€‚

    const myColor = ['beige', 'burgundy', 'charcoal', 'ivory'];
    
    const [color1, color2, ...others  ] = myColor;
    console.log(color1);   // 'beige'
    console.log(color2);   // 'burgundy'
    console.log(others);   // ['charcoal', 'ivory']

    push()ใฏ้…ๅˆ—ใฎๆœ€ๅพŒใซ่ฆ็ด ใ‚’่ฟฝๅŠ ใ™ใ‚‹ใจใใ‚ˆใไฝฟใ†ใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใ€‚

    push()ใƒกใ‚ฝใƒƒใƒ‰ใจใ‚นใƒ—ใƒฌใƒƒใƒ‰ๆง‹ๆ–‡ใ‚’ไธ€็ท’ใซไฝฟใ†ใจ้…ๅˆ—ใฎ็ตๅˆใŒใงใใพใ™ใ€‚

    ใงใ‚‚ใ“ใฎๆ–นๆณ•ใฏๆ—ขๅญ˜ใƒ‡ใƒผใ‚ฟใฎไธŠใซๆ–ฐใ—ใ„ใƒ‡ใƒผใ‚ฟใ‚’ไธŠๆ›ธใใ™ใ‚‹ใฎใงๆ—ขๅญ˜ใƒ‡ใƒผใ‚ฟใฎๅค‰ๆ›ดใซๆณจๆ„ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

    const pizza = ['dough', 'cheese', 'meat', 'source'];
    const pizzaAdd = ['parmesan', 'tabasco'];
    
    pizza.push(...pizzaAdd);   
    
    // ['dough', 'cheese', 'meat', 'source', 'parmesan', 'tabasco'];
    console.log(pizza); 
    

    2. ็ทๅˆ

    ้…ๅˆ—ใ‚’็ตๅˆใ™ใ‚‹ๆ–นๆณ•ใฎไธญconcat(), …spread, push()ใซใคใ„ใฆ่ชฟในใฆใฟใพใ—ใŸใ€‚

    ็Šถๆณใซใ‚ˆใ‚Šๅฟ…่ฆใชๆ–นๆณ•ใŒ้•ใ†ใฎใงใ€ใ‚ทใ‚นใƒ†ใƒ ใ‚„ใƒญใ‚ธใƒƒใ‚ฏใ‚’่€ƒใˆใŸไธŠใง้ธใ‚“ใ ใ‚‰ๅ•้กŒใฏใชใ„ใจๆ€ใ„ใพใ™ใ€‚

    ใ‚ใ–ใƒผใ™๏ผ