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()ใซใคใ„ใฆ่ชฟในใฆใฟใพใ—ใŸใ€‚

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

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

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ํŽธ๋ฆฌํ•œ ๋ฐฐ์—ด ๋ณ‘ํ•ฉ ๋ฐฉ๋ฒ•(Merge Arrays in Javascript)

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฐฐ์—ด ๋ณ‘ํ•ฉ ๋ฐฉ๋ฒ•(concat(), …spread, push())

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ผ์ด ์ ์  ๋” ๋งŽ์•„์ง€๊ณ , ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๋ จ ์ž‘์—…์„ ๋งŽ์ด ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    ๊ทธ ์ค‘์—์„œ๋„ ๋ณ‘ํ•ฉ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


    ๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค(Index)๋ฅผ ๊ฐ–๋Š” ์š”์†Œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜ํƒ€๋‚ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

    ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์ด๋ผ๋ฉด ์ธ๋ฑ์Šค ๋˜๋Š” ๋ฉ”์†Œ๋“œ(unshift(), push(), shift(), pop(), splice(), find(), includes(), join(), indexOf() ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์ฃ .

    ๋ฐฐ์—ด์˜ ๋ณ‘ํ•ฉ(Merge) ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

    concat(), push(), ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(…spread), ๋“ฑ ๋ฐฐ์—ด์˜ ๋ณ‘ํ•ฉ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

    ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    1. ๋ฐฐ์—ด ๋ณ‘ํ•ฉ์˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

    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() ์„ธ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    ๊ฐ ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ˆ ํ•„์š”์— ๋”ฐ๋ผ ๋งž๋Š” ๊ฒƒ์„ ๊ณจ๋ผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

    ใ‚„ใ™ใใฆ้€Ÿใ„ๆญฃ่ฆ่กจ็พ(Easy Regular Expression)

    ๆญฃ่ฆ่กจ็พใฎๆง‹ๆˆใจๆ„ๅ‘ณใ€ใ‚ธใƒฃใƒใ‚นใ‚ฏใƒชใƒ—ใƒˆ(Javascript)ใงใฎใŠๆ‰ฑใ„

    ๆญฃ่ฆ่กจ็พใจใ„ใ†ใฎใฏๆคœ็ดขใƒ‘ใƒผใ‚ฟใƒณใ‚’ๆŒ‡ๅฎšใ—่จ˜ๅทใง่กจ็คบใ—ใŸใ‚‚ใฎใงใ™ใ€‚

    ใ“ใฎใ‚ขใ‚คใƒ‡ใ‚ขใฏใ‚ขใƒกใƒชใ‚ซใฎๆ•ฐๅญฆ่€…ใงใ‚ใ‚‹ใ‚นใƒ†ใ‚ฃใƒผใƒ–ใƒณใ‚ณใƒผใƒซใ‚ฏใƒชใƒผใƒณ(Stephen Cole Kleene)ใŒ1950ๅนดไปฃใซๆญฃ็พฉใ—ใŸๆญฃ่ฆ่จ€่ชž(Regular Language)ใจ้–ขไฟ‚ใŒใ‚ใ‚Šใพใ—ใฆใ€ๆญฃ่ฆ่กจ็พใฎๆ–‡ๆณ•ใฏ1980ๅนดไปฃใซใƒ‘ใƒผใƒซ(Perl)่จ€่ชžใ‹ใ‚‰ไฝฟใ„ๅง‹ใพใ‚Šใพใ—ใŸใ€‚

    ไธปใซใ€ๆคœ็ดขใ‚„็ฝฎๆ›ใฎไฝœๆฅญใซไฝฟใ‚ใ‚Œใ€็š†ใŒไฝฟใ†ใปใจใ‚“ใฉใฎใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ่จ€่ชžใฎไธญใงใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใ‚‹ๆ–‡ๆณ•ใงใ™ใ€‚

    ไพ‹ใˆใฐใ€ๆฌกใฎๆ–‡็ซ ใฎไธญใง็‰นๅฎšใ—ใŸๆกไปถใ‚’ๆคœ็ดขใ™ใ‚‹ใจใๆญฃ่ฆ่กจ็พใฎๅŠ›ใ‚’ๅ€Ÿใ‚Šใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.

    • ‘too’ ๆ–‡ๅญ—ๅˆ—ใ‚’ๆคœ็ดขใ™ใ‚‹ -> /too/
      The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
    • ๅคงใ€ๅฐๆ–‡ๅญ—ใ‚’ๆง‹ใ‚ใชใ ‘t’ ๆ–‡ๅญ—ใ‚’ๆคœ็ดขใ™ใ‚‹ใจใ -> /t/-gi
      The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
    • ‘d’ ใ‹ใ‚‰ๅง‹ใพใ‚‹ๅ˜่ชžๅŠใณๆ–‡ๅญ—ใฎใ™ในใฆใ‚’ๆคœ็ดขใ™ใ‚‹ใจใ -> /[d]\w+/-gi
      The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
    • ‘ea’ใ‚’ๅซใ‚€ๅ˜่ชžใ‚’ๆคœ็ดขใ™ใ‚‹ใจใ -> /[a-z]*ea[a-z]*/-i
      The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it

    ๆญฃ่ฆ่กจ็พใฎๆ–‡ๆณ•ใƒ†ใ‚นใƒˆใฏๆฌกใฎใƒšใƒผใ‚ธใŒๅŠฉใ‹ใ‚Šใพใ™ใ€‚

    regexr.com

    ้’ใ„ใƒใƒผExpressionใฎไธ‹ใฎใ‚คใƒณใƒ—ใƒƒใƒˆใซใฏ่กจ็พใ‚’ๅ…ฅใ‚Œๆ›ธใใ€ใใฎไธ‹ใฎใƒœใƒƒใ‚ฏใ‚นใซใฏๆคœ็ดขๅฏพ่ฑกใซใชใ‚‹ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๅ…ฅใ‚Œใ‚Œใฐใ‚ชใƒƒใ‚ฑใƒผใงใ™ใ€‚

    ใพใšใ€่กจ็พใฎๆ„ๅ‘ณใซใคใ„ใฆๅฐ‘ใ—ๅ‹‰ๅผทใ—ใฆใ‹ใ‚‰Javascriptใงๆฅฝใซไฝฟใ†ๆ–นๆณ•ใ‚’็ขบ่ชใ—ใฆใฟใพใ™ใ€‚


    1. ๆญฃ่ฆ่กจ็พใฎ่จ˜ๅท

    • / . / โ†’ ใ™ในใฆใฎๆ–‡ๅญ—
    • / + / โ†’ ไธ€ใคไปฅไธŠใฎๆ–‡ๅญ—
    • / ? / โ†’ ๏ผใพใŸใฏไธ€ใคใฎๆ–‡ๅญ—
    • / ^ / โ†’ ่ฉฒๅฝ“ใฎๆ–‡ๅญ—ใ‚’้™คใ
    • / / โ†’ ็ฏ„ๅ›ฒๆŒ‡ๅฎš
    • / * / โ†’ ๏ผใพใŸใฏไธ€ใคไปฅไธŠใฎๆ–‡ๅญ—
    • / [ ] / โ†’ ใ‚ฐใƒซใƒผใƒ—ใ‚ปใƒƒใƒˆ
    • / { } / โ†’ ็นฐใ‚Š่ฟ”ใ—ใฎๅ›žๆ•ฐๆŒ‡ๅฎš
    • / \ / โ†’ ใ‚จใ‚นใ‚ฑใƒผใƒ—
    • / \d / โ†’ ใ™ในใฆใฎๆ•ฐๅญ—
    • / \D / โ†’ ๆ•ฐๅญ—ใงใฏใชใ„ๆ–‡ๅญ—
    • / \w / โ†’ ใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใ€ๆ•ฐๅญ—ใ€ใ‚ขใƒณใƒ€ใƒผใƒใƒผ
    • / \W / โ†’ ใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใ€ๆ•ฐๅญ—ใ€ใ‚ขใƒณใƒ€ใƒผใƒใƒผใงใฏใชใ„ๆ–‡ๅญ—
    • / \s / โ†’ ็ฉบ็™ฝๆ–‡ๅญ—
    • / \S / โ†’ ็ฉบ็™ฝใงใฏใชใ„ๆ–‡ๅญ—
    • / \n / โ†’ ๆ”น่กŒ

    ๅŸบๆœฌ็š„ใซๆญฃ่ฆ่กจ็พใ‚’ๆง‹ๆˆใ™ใ‚‹่จ˜ๅทใฏไธŠ่จ˜ใงใ‚ใ‚Šใ€ใ“ใฎ่จ˜ๅทใ•ใˆ่ฆšใˆใ‚Œใฐๆญฃ่ฆ่กจ็พใฎๅŸบๆœฌ็š„ใชไป•็ต„ใฟใฏๅๅˆ†็†่งฃใงใใ‚‹ใจๆ€ใ„ใพใ™ใ€‚

    ใใ‚Œใงใฏใ‚ตใƒณใƒ—ใƒซใ‚’ๅ‚่€ƒใ—ใชใŒใ‚‰ๆญฃ่ฆ่กจ็พใ‚’ๅˆ†ๆžใ—ใฆใ„ใใพใ—ใ‚‡ใ†ใ€‚


    2. ่จ˜ๅทใฎๆ„ๅ‘ณ

    ๆญฃ่ฆ่กจ็พใงไธ€็•ชๅŸบ็คŽใซใชใ‚‹่จ˜ๅทใงใ‚ใ‚‹ใฎใง่ฆšใˆใฆใŠใใจๅฝนใซ็ซ‹ใก้ƒจๅˆ†ใงใ™ใ€‚

    dใฏๆ•ฐๅญ—ใ€ wใฏ่‹ฑๆ–‡ๅญ—ใ€ sใฏ็ฉบ็™ฝใ€ nใฏๆ”น่กŒใฎๆ„ๅ‘ณใงใ‚ใ‚Šใ€ๅ„ๆ–‡ๅญ—ใฎๅคงๆ–‡ๅญ—ใฏ NOT(ๅๅฏพ)ใ‚’็คบใ—ใพใ™ใ€‚

    • ๆ•ฐๅญ—ใŒไธ€ๅ›žไปฅไธŠ็นฐใ‚Š่ฟ”ใ™ๆ–‡ๅญ—ๆคœ็ดข ๐Ÿ‘‰ / [\d]+ /
    • ๆ•ฐๅญ—ใงใฏใชใ„ๆ–‡ๅญ—ใ‚’ๆคœ็ดข๏ผˆ็ฉบ็™ฝๅซใ‚€๏ผ‰ ๐Ÿ‘‰ / [\D] /
    • ๆ‹ฌๅผง(ใ‹ใฃใ“)ใŒๅซใพใ‚Œใฆใ„ใ‚‹ๆ–‡ๅญ—ใ€ๆ•ฐๅญ—ๆคœ็ดข ๐Ÿ‘‰ / \([\w]+\) /
    • ่‹ฑๆ–‡ๅญ—ใ€ๆ•ฐๅญ—ใ€ใ‚ขใƒณใƒ€ใƒผใƒใƒผใงใฏใชใ„ๆ–‡ๅญ—ๆคœ็ดข ๐Ÿ‘‰ / [\W]+ /
    • ็ฉบ็™ฝๆคœ็ดข ๐Ÿ‘‰ / \s /

    ไธŠใง็ดนไป‹ใ—ใŸregexr.comใงๆคœ็ดขๅฏพ่ฑกใซใชใ‚‹ใƒ†ใ‚ญใ‚นใƒˆใ‚’ใ„ใ‚Œใฆใƒ‘ใƒผใ‚ฟใƒณใ‚’็›ดๆŽฅใซไฝœๆˆใ—ใฆใฟใ‚‹ใจใ™ใๆญฃ่ฆ่กจ็พใซใชใ‚Œใ‚‹ใจๆ€ใ„ใพใ™ใ€‚


    ๅคงไฝ“ใ‚จใ‚นใ‚ฑใƒผใƒ—ใจใ„ใ†ใฎใฏไฝ•ใงใ™ใ‹ใญใ€‚

    ใ‚ญใƒผใƒœใƒผใƒ‰ใฎไธ€็•ชๅทฆไธ€็•ชไธŠใฎใ‚ญใƒผ(ESCใจๆ›ธใ‹ใ‚Œใฆใ„ใ‚‹ใ‚‚ใฎ)ใŒใ‚จใ‚นใ‚ฑใƒผใƒ—ใฎ็•ฅๅญ—ใงใ™ใ€‚ใ‚จใ‚นใ‚ฑใƒผใƒ—ใฎๆ„ๅ‘ณใฏ้€ƒใ‚Œใ‚‹ใฎใงใ™ใ€‚

    ใ“ใกใ‚‰ใงใฏ็ด„ๆŸใ‹ใ‚‰้€ƒใ‚Œใ‚‹ใ“ใจใ ใจ่ช่ญ˜ใ™ใ‚Œใฐใ„ใ„ใจๆ€ใ„ใงใ™ใ€‚

    ไพ‹ใˆใฐใ€ๆญฃ่ฆ่กจ็พใง็‚น(. dot)ใฏใ™ในใฆใฎๆ–‡ๅญ—ใฎๆ„ๅ‘ณใซใ—ใ‚ˆใ†ใจ็ด„ๆŸใ—ใŸ็‰นๅˆฅใชๆ–‡ๅญ—ใงใ™ใญใ€‚

    ใงใ‚‚ใŸใพใซใฏโ€™ใใ‚Œ็ด„ๆŸไปฅๅค–โ€™ใซ็‚นใ‚’ใƒ”ใƒชใ‚ชใƒ‰ๆ„ๅ‘ณใฎ็‚นใงไฝฟใ„ใŸใ„ใจใใŒใ‚ใ‚Šใพใ™ใญใ€‚

    ใ“ใฎๆ™‚ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ‚’ไฝฟใ„ใพใ™ใ€‚

    ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ‚’ไฝฟใ‚ใชใ„้™ใ‚Šใ€ๆ–‡ๅญ—ใฏ็ด„ๆŸใ—ใŸๆฉŸ่ƒฝใจใ—ใฆๅ‹•ใใพใ™ใ€‚

    ไธ‹ใฎไพ‹ใง็ขบ่ชใ—ใพใ—ใ‚‡ใ†ใ€‚

    • ใ™ในใฆใฎๆ–‡ๅญ—ใ‚’ๆ„ๅ‘ณใ€‚ a, b, c, d, ?, !, @, , ใชใฉใ™ในใฆใฎๆ–‡ๅญ—ใฎไธญไธ€ใค ๐Ÿ‘‰ / . /
    • ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ‚’ๅ‰ใซใคใ‘ใ‚‹ใจใŸใ ใƒ”ใƒชใ‚ชใƒ‰่จ˜ๅทใ ใ‘ใฎๆ„ๅ‘ณ ๐Ÿ‘‰ / \. /
    • ไธ€ใคไปฅไธŠใฎๆ–‡ๅญ—ใฎๆ„ๅ‘ณ ๐Ÿ‘‰ / + /
    • ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ‚’ๅ‰ใซใคใ‘ใ‚‹ใจใŸใ ใƒ—ใƒฉใ‚น่จ˜ๅทใ ใ‘ใฎๆ„ๅ‘ณ ๐Ÿ‘‰ / \+ /

    ใ‚จใ‚นใ‚ฑใƒผใƒ—ใฏใ‚ˆใไฝฟใ‚ใ‚Œใ‚‹ๅฟ…้ ˆใชๆฉŸ่ƒฝใงใ‚ใ‚‹ใฎใงใ€ใใฎใพใพใฎๆ–‡ๅญ—ใซใฏใชใ‚‰ใชใ„ใฎใงใ‚จใ‚นใ‚ฑใƒผใƒ—ใŒๅฟ…่ฆใช็‰นๅˆฅใชๆ–‡ๅญ—(. ? + *ใชใฉ๏ผ‰ใ‚’่ฆšใˆใฆใŠใๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

    ใใฎๆ–‡ๅญ—ใฎไธ€้ƒจใ‚’ไธ‹ใง็ดนไป‹ใ—ใพใ™ใ€‚


    ไธŠใง็ดนไป‹ใ—ใŸ็‰นๅˆฅใช่จ˜ๅทใฏ็‰นๅˆฅใชๆ„ๅ‘ณใ‚’ๆŒใกใพใ™ใ€‚ไปฃ่กจ็š„ใชไฝฟใ„ๆ–นใฏไธ‹ใฎ้€šใ‚Šใงใ™ใ€‚

    • ๅฐๆ–‡ๅญ—a~zๆˆ–ใฏๅคงๆ–‡ๅญ—A~Zไธญไธ€่‡ดใ™ใ‚‹่‹ฑๆ–‡ๅญ—ๆคœ็ดข ๐Ÿ‘‰ / [a-zA-Z] /
    • colorๆˆ–ใฏcolourใ‚’ๆคœ็ดข(‘u’ใŒใ‚ใฃใฆใ‚‚ใชใใฆใ‚‚ใ„ใ„) ๐Ÿ‘‰ / colou?r /
    • ‘a’ใ‚’ๅซใ‚€ๅ˜่ชžๆคœ็ดข ๐Ÿ‘‰ / [\S]*a[a-zA-Z]* /
    • a-zๆˆ–ใฏ็ฉบ็™ฝ(space)ใงใฏใชใ„ๆ–‡ๅญ—ๆคœ็ดข ๐Ÿ‘‰ / [^a-z ] /
    • ่‹ฑๆ–‡ๅญ—ใ‹ใ‚‰ๅง‹ใ‚ๅฟ…ใšๆ•ฐๅญ—ใพใŸใฏ็‰นๆฎŠ่จ˜ๅทใ‚’ๅซใ‚€ๆ–‡ๅญ—ๅˆ—ใ‚’ๆคœ็ดข ๐Ÿ‘‰ / [a-zA-Z]+[\d!@#\$%\^*]+[\w]* /

    ไธญๆ‹ฌๅผงใฏ็นฐใ‚Š่ฟ”ใ—ใฎๅ›žๆ•ฐใ‚’ๆŒ‡ๅฎšใ—ใ€ใ“ใ‚Œใ‚’ไฝฟใ†ใจ่ฉณใ—ใ„ๆคœ็ดขใƒ‘ใƒผใ‚ฟใƒณใฎ่จญๅฎšใŒๅฏ่ƒฝใงใ™ใ€‚

    ไธญๆ‹ฌๅผงใฎไธญใ€ไธ€ใคใฎๆ•ฐๅญ—ใฏๅ…จไฝ“ใฎ็นฐใ‚Š่ฟ”ใ—ๅ›žๆ•ฐใฎๆ„ๅ‘ณใงใ‚ใ‚Šใ€ไบŒใคใฎๆ•ฐๅญ—ใฏ้ ญใจๆœซใฎ็ฏ„ๅ›ฒใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ๆ„ๅ‘ณใงใ™ใ€‚

    ไพ‹ใˆใ€{3}ใฏ๏ผ“ๅ›ž็นฐใ‚Š่ฟ”ใ—ใฎๆ„ๅ‘ณใงใ‚ใ‚Šใ€{1, 3}ใฏ็ฏ„ๅ›ฒๅŒบ้–“1ใ‹ใ‚‰3ใฎๆ„ๅ‘ณใงใ™ใ€‚

    {1, }ใฎใ‚ˆใ†ใช่กจ็พใ‚‚ๅฏ่ƒฝใงใ‚ใ‚Šใ€ใ“ใ‚Œใฏ+่จ˜ๅทใจๅŒๆง˜ใชๆ„ๅ‘ณ,ใ€€ใคใพใ‚Šไธ€ใคไปฅไธŠใฎๆ„ๅ‘ณใงใ‚ใ‚Šใพใ™ใ€‚

    • AใŒ3ๅ›ž็นฐใ‚Š่ฟ”ใ™ๆ–‡ๅญ—ใ‚’ๆคœ็ดข ๐Ÿ‘‰ / [A]{3} /
    • 3ๆกไปฅไธŠใฎๆ•ฐๅญ—ใ‚’ๆคœ็ดข(3๋ฒˆไปฅไธŠ็นฐใ‚Š่ฟ”ใ—) ๐Ÿ‘‰ / [\d]{3,} /
    • AใŒไบŒๅ›žใ‹ใ‚‰ไธ‰ๅ›žใพใง็นฐใ‚Š่ฟ”ใ™ๆ–‡ๅญ—ใ‚’ๆคœ็ดข(็นฐใ‚Š่ฟ”ใ™็ฏ„ๅ›ฒๆŒ‡ๅฎš) ๐Ÿ‘‰ / [A]{2,3} /

    ็นฐใ‚Š่ฟ”ใ—ๅ›žๆ•ฐใ ใ‘ใ‚’ๆŒ‡ๅฎšใ™ใ‚Œใฐใ€ๆ„ๅ›ณใ—ใชใ„็ตๆžœใŒๅ‡บใ‚‹ใ“ใจใŒใ‚ใ‚‹ใฎใงใ€้ƒจๅˆ†ๅผ(subexpression)ใจๅ…จๅพŒๆ–นไธ€่‡ดๆคœ็ดขใ‚’ไธ€็ท’ใซไฝฟใ†ใจใ‚‚ใฃใจๅŠนๆžœ็š„ใชใƒ‘ใƒผใ‚ฟใƒณใŒๅฏ่ƒฝใงใ™ใ€‚


    ่ง’ใ‹ใฃใ“ใฎไธญใซ่จ˜ๅทใ‚’ๆ›ธใใ€ๆคœ็ดขใƒ‘ใƒผใ‚ฟใƒณใ‚’ๆŒ‡ๅฎšใ—ใพใ™ใ€‚็›ดๆŽฅใซ่จ˜ๅทใ‚’ๆ›ธใ่พผใ‚“ใ ใ‚Šใ€็ฏ„ๅ›ฒๆŒ‡ๅฎš่จ˜ๅทใฎ’-‘ใ‚’ไฝฟใฃใฆใƒ‘ใƒผใ‚ฟใƒณใ‚’ๆŒ‡ๅฎšใ—ใพใ™ใ€‚

    • ๆŒ‡ๅฎšใ™ใ‚‹ๆ–‡ๅญ—(a ๆˆ–ใฏ A ๆˆ–ใฏ b ๆˆ–ใฏ B ๆˆ–ใฏ c ๆ–‡ๅญ—)ไธ€ใคใ‚’ๆคœ็ดข ๐Ÿ‘‰ [aAbBc]
    • aใ‹ใ‚‰ eใพใง(a,b,c,d,e)ใฎ็ฏ„ๅ›ฒๅ†…ไธ€ใคใฎๆ–‡ๅญ—ใ‚’ๆคœ็ดข ๐Ÿ‘‰ [a-e]
    • ้™คๅค–ๆ–‡ๅญ—’^’ใŒใ‚ใ‚‹ใฎใง a-z ็ฏ„ๅ›ฒใซๅ…ฅใ‚‰ใชใ„ๆ–‡ๅญ—(่จ˜ๅท)ใ‚’ไธ€ใคๆคœ็ดข ๐Ÿ‘‰ [^a-z]
    • ๆ˜Ž่จ˜ใ—ใŸ่จ˜ๅทใฎไธ€ใคใ‚’ๆคœ็ดข ๐Ÿ‘‰ [?!@#$%^&*()_]
    • cๆˆ–ใฏCใ‹ใ‚‰ๅง‹ใ‚, a-zใฎไธญไธ€ใคใง็ต‚ใ‚ใ‚‹ๅ˜่ชžๆคœ็ดข ๐Ÿ‘‰ [cC][a-z]

    [ ]ใ‚’ไฝฟใ†ใจไธ€ใคใ ใ‘ใฎๆ–‡ๅญ—ใ‚’ๆคœ็ดขใ™ใ‚‹ใฎใงไธ€ใคไปฅไธŠใฎๆ–‡ๅญ—ใ‚’ๆคœ็ดขใ—ใŸใ„ใจใใซใฏ+่จ˜ๅท๏ผˆไธ€ใคไปฅไธŠใฎๆ–‡ๅญ—ใ€๏ผใฏไธๅฏ๏ผ‰ใพใŸใฏ๏ผŠ๏ผˆ๏ผใพใŸใฏไธ€ใคไปฅไธŠใฎๆ–‡ๅญ—ใ€๏ผใ‚‚ๅฏ่ƒฝ๏ผ‰่จ˜ๅทใ‚’ไป˜ใ‘ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

    • ไธ€ใคไปฅไธŠใฎa-zๆ–‡ๅญ—ใ‚’ๆคœ็ดข(ๅฟ…ใšไธ€ใคไปฅไธŠใฎๆกไปถ) ๐Ÿ‘‰ [a-z]+
    • ๏ผๅ€‹ไปฅไธŠใฎA-Zๆ–‡ๅญ—ใ‚’ๆคœ็ดข(ใชใใฆใ‚‚ใ„ใ„) ๐Ÿ‘‰ [A-Z]*

    ็‰นๅฎšๆง‹ๆˆใงๆˆใ‚Š็ซ‹ใคๆ–‡ๅญ—ๅˆ—ใฎๆคœ็ดขใซๅŠนๆžœ็š„ใงใ‚ใ‚Šใ€ไพ‹ใˆใฐใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใฎๆ–‡ๅญ—ๅˆ—ใŒใ‚ใ‚Šใพใ™ใ€‚

    ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นๅฝขๅผใฎabcd@xyz.comใ‚’ๆคœ็ดขใ™ใ‚‹ใŸใ‚ใซใฏๆฌกใฎใ‚ˆใ†ใชใƒ‘ใƒผใ‚ฟใƒณใ‚’ไฝฟใ†ใ“ใจใŒใงใใพใ™ใ€‚

    /[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+/

    ใงใฏใ€ใƒ‘ใƒผใ‚ฟใƒณใ‚’ๅˆ†ๆžใ—ใฆใฟใพใ™ใ€‚

    ๅ…ˆใ€ใƒกใƒผใƒซใฎIDใซใชใ‚‹้ƒจๅˆ†ใฏ่‹ฑๆ–‡ๅญ—ใจๆ•ฐๅญ—ใŒๅ…ฅใ‚‹ใฎใงใ€[a-zA-Z0-9]ใงๅง‹ใ‚ไธ€ใคไปฅไธŠใ‚’ๆ„ๅ‘ณใ™ใ‚‹+่จ˜ๅทใ‚’ไป˜ใ‘ใพใ™ใ€‚

    ใใฎๆฌกใ€@ใŒ็ถšใใพใ™ใฎใง@ใ‚’ๅ…ฅใ‚Œ, ใƒ›ใ‚นใƒˆใฎใ‚ขใƒ‰ใƒฌใ‚นใ‚‚ไธ€ใคไปฅไธŠใฎ่‹ฑๆ–‡ๅญ—ใจๆ•ฐๅญ—ใ‚’ๆŒ‡ๅฎšใ—ใพใ™ใ€‚

    .comๅฝขใฎใ‚ขใƒ‰ใƒฌใ‚นใชใฎใงใƒ”ใƒชใ‚ชใƒ‰ใ‚’ใใฎใพใพไฝฟใ†ใŸใ‚ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ‚’ไฝฟใ„ใพใŸไธ€ใคไปฅไธŠใฎ่‹ฑๆ–‡ๅญ—ใ‚’ๅ…ฅใ‚Œใฆใƒ‘ใƒผใ‚ฟใƒณใ‚’็”Ÿๆˆใ—ใพใ™ใ€‚

    ใ‚‚ใ—IDใฎไธญใซ็‚นใŒๅ…ฅใ‚‹ใ‹ใƒ›ใ‚นใƒˆใ‚ขใƒ‰ใƒฌใ‚นใŒ.co.jpใชใฉใฎๅฝขใซใชใ‚‹ใจใใซใฏใใ‚Œใซๅฏพใ™ใ‚‹ๅฟœ็”จใŒๅฟ…่ฆใงใ™ใ€‚



    3. ใพใจใ‚

    ๆญฃ่ฆ่กจ็พใฎ็ฌฌไธ€ๅฐ่ฑกใฏใพใ‚‹ใงๅค–็•Œ่จ€่ชžใฟใŸใ„ใชๅงฟใงๅบƒใไฝฟใ‚ใ‚Œใ‚‹ๆ—ขๅญ˜ใฎ่จ€่ชžใจใฏ้•ใ†ๆง˜ๅญใ‚’ใ—ใฆใพใ™ใญใ€‚

    ่ปฝใ่ฟ‘ใฅใ‘ใ‚‰ใ‚Œใชใใ„ใ‚„ใชๆฐ—ๆŒใŒใ™ใ‚‹ใจใใ‚‚ใ‚ใ‚Šใพใ™ใŒใ€ๅฐ‘ใ—ใ ใ‘ใงใ‚‚่ชฟในใฆใฟใŸใ‚‰ๆ„ๅค–ใจ็ฐกๅ˜ใช่ฆๅ‰‡ใงใƒ‘ใƒฏใƒ•ใƒซๆฉŸ่ƒฝใ‚’ๆŒใฃใฆใ„ใ„ใ‚„ใคใ ใชใจๆ€ใ‚ใ‚Œใ‚‹ๆ™‚ใŒๆฅใ‚‹ใ‹ใ‚‚ใงใ™ใญใ€‚

    ไธŠใง็ดนไป‹ใ—ใŸ้ƒจๅˆ†ใฏไปฃ่กจ็š„ใชๆฉŸ่ƒฝใ‚’็ดนไป‹ใ™ใ‚‹ใŸใ‚็ฐกๅ˜ใชใƒ‘ใƒผใ‚ฟใƒณใŸใกใชใฎใงใ€ไธŠใฎใƒ‘ใƒผใ‚ฟใƒณใฏไธๅฎŒๅ…จใชใƒ‘ใƒผใ‚ฟใƒณใงใ‚ใ‚Šใพใ™ใ€‚ใ‚‚ใฎๆญฃใ—ใ„ใƒ‘ใƒผใ‚ฟใƒณใ‚’ไฝœใ‚‹ใŸใ‚ใซใฏใ‚‚ใฃใจๆทฑใๅ‹‰ๅผทใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใญใ€‚

    ใ”่ณชๅ•ใŒใ‚ใ‚Šใพใ—ใŸใ‚‰ใ€่‡ช็”ฑใซใ‚ณใƒกใƒณใƒˆใใ ใ•ใ„๏ผ

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