[JavaScript] ES6 ๋ฌธ๋ฒ• ์ •๋ฆฌ๐Ÿ“‘

kim unknownยท2022๋…„ 4์›” 18์ผ
6

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
10/23
post-thumbnail

0. ES6๋ž€โ”

ES6(ECMAScript 6)๋Š” ECMAScript ํ‘œ์ค€์˜ ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์ด๋‹ค.
ํ˜„๋Œ€์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค. ์ด๊ฒƒ์ด ES6๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋‹ค.


1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์˜ ์ฐจ์ด (var, let, const)

- var์€ ์žฌ์ •์˜์™€ ์žฌ์„ ์–ธ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค.
- let์€ ๊ฐ€๋ณ€๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์žฌ์„ ์–ธ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
- const๋Š” ๋ถˆ๋ณ€๋ณ€์ˆ˜๋กœ ์žฌ์„ ์–ธ๊ณผ ์žฌ์ •์˜ ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

* ์žฌ์„ ์–ธ: ๋˜‘๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ
* ์žฌ์ •์˜: ๊ฐ’์ด ์ง€์ •๋œ ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋ฐ”๊พธ๋ ค๋Š” ๊ฒƒ
* ์Šค์ฝ”ํ”„(scope) : ์‹๋ณ„์ž(ex. ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช…, ํด๋ž˜์Šค๋ช… ๋“ฑ)์˜ ์œ ํšจ๋ฒ”์œ„

//๋ณ€์ˆ˜ ์„ ์–ธ
var x = 2;
// ์žฌ์ •์˜
x = 4;
// ์žฌ์„ ์–ธ
var x = 4;
  • var์˜ ๋ฌธ์ œ์ 
    โ‘  ๋ณ€์ˆ˜ ์„ ์–ธ์ด ์œ ์—ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    โ‘ก ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง„๋‹ค๋ฉด ์–ด๋””์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ ๋ ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
    โ‘ข ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋กœ ์ธํ•ด ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๋œ๋‹ค.
    โ‘ฃ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์–ธ์ œ๋‚˜ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (ํ˜ธ์ด์ŠคํŒ… ๋ฐœ์ƒ)
    โžก๏ธ ๋”ฐ๋ผ์„œ, var์€ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, let๊ณผ const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

2. ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด (Template literals)

ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ES6๋ถ€ํ„ฐ ์ƒˆ๋กœ ๋„์ž…๋œ ๋ฌธ์ž์—ด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ, ๋ฌธ์ž์—ด ์ƒ์„ฑ์‹œ ๋”ฐ์˜ดํ‘œ ๋Œ€์‹ , ๋ฐฑํ‹ฑ(`)์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ์˜ดํ‘œ์™€ ๋‹ฌ๋ฆฌ ๋ฐฑํ‹ฑ ์•ˆ์—์„œ๋Š” ์ค„๋ฐ”๊ฟˆ์ด ๋ฐ˜์˜๋œ๋‹ค. ๋˜ํ•œ, ๋ฌธ์ž์—ด ์‚ฌ์ด์— ๋ณ€์ˆ˜๋‚˜ ์—ฐ์‚ฐ์„ ๋„ฃ์„ ๋•Œ๋Š” ${} ์‚ฌ์ด์— ํ‘œํ˜„์‹์„ ์‚ฝ์ž…ํ•œ๋‹ค.

var jsp = "์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ";

// ๊ธฐ์กด ์ฝ”๋“œ
console.log("์ด๊ฑด " + jsp + "์ž…๋‹ˆ๋‹ค.");

// ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹
console.log(`์ด๊ฑด ${jsp}์ž…๋‹ˆ๋‹ค.`);

// ์ถœ๋ ฅ ๊ฒฐ๊ณผ -> ์ด๊ฑด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (Arrow function)

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.

// ๊ธฐ๋ณธ ํ•จ์ˆ˜ ํ˜•์‹
let sum = function(a, b) {
  return a + b;
};

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ํ˜•์‹
let sum = (a, b) => a + b;
  • ์ธ์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†๋‹ค๋ฉด ์ธ์ˆ˜๋ฅผ ๊ฐ์‹ธ๋Š” ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ธ์ˆ˜๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋• ๊ด„ํ˜ธ๋ฅผ ๋น„์›Œ๋†“์œผ๋ฉด ๋œ๋‹ค. ๋‹ค๋งŒ, ์ด ๋•Œ ๊ด„ํ˜ธ๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ณธ๋ฌธ์ด ํ•œ ์ค„ ๋ฐ–์— ์—†๋‹ค๋ฉด ์ค‘๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ค‘๊ด„ํ˜ธ๋Š” ๋ณธ๋ฌธ ์—ฌ๋Ÿฌ ์ค„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ๋ฉฐ, ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด return์œผ๋กœ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

4. ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ (export/import)

๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” named export์™€ default export๊ฐ€ ์žˆ๋‹ค.

// named export ๊ธฐ๋ณธ ํ˜•์‹
export { ๋ชจ๋“ˆ๋ช…1, ๋ชจ๋“ˆ๋ช…2 };
import { ๋ชจ๋“ˆ๋ช…1, ๋ชจ๋“ˆ๋ช…2 } from 'js ํŒŒ์ผ ๊ฒฝ๋กœ';

// default export ๊ธฐ๋ณธ ํ˜•์‹
export default ๋ชจ๋“ˆ๋ช…;
import ๋ชจ๋“ˆ๋ช… from 'js ํŒŒ์ผ ๊ฒฝ๋กœ';

- named export๋Š” ํ•œ ํŒŒ์ผ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ exportํ•  ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. exportํ•œ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ importํ•ด์•ผ ํ•˜๋ฉฐ, ์ค‘๊ด„ํ˜ธ์— ๋ฌถ์–ด์„œ import ํ•ด์•ผ ํ•œ๋‹ค.
๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ import ํ•˜๋ ค๋ฉด as๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ•œ ํŒŒ์ผ์— ์žˆ๋Š” ํด๋ž˜์Šค๋‚˜ ๋ณ€์ˆ˜๋“ค์„ ํ•œ ๋ฒˆ์— import ํ•˜๋ ค๋ฉด * as๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

// named export๋Š” ์ค‘๊ด„ํ˜ธ ํฌํ•จ import 
import { named1, named2 } from './example.js';

// named export์—์„œ as๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ import
import { named1 as myExport, named2 } from './example.js';

// ํ•œ ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋‚˜ ๋ณ€์ˆ˜๋ฅผ * as๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ์— import
import * as Hello from './example.js';

- default export๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜ ๋˜๋Š” ํด๋ž˜์Šค ๋“ฑ๋“ฑ๋งŒ export ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ import ํ•  ๋•Œ ์•„๋ฌด ์ด๋ฆ„์œผ๋กœ๋‚˜ ์ž์œ ๋กญ๊ฒŒ import ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ค‘๊ด„ํ˜ธ์— ๋ฌถ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

// default export ๋Š” ์ค‘๊ด„ํ˜ธ ์—†์ด import 
import default1 from './example.js';

5. ํด๋ž˜์Šค (class)

Class๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ, ํ‹€๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

โ€ข ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๋ ค๋ฉด class ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์ž‘์„ฑํ•œ๋‹ค.
โ€ข ํด๋ž˜์Šค๋Š” ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์—†๋‹ค.
โ€ข ํด๋ž˜์Šค ์„ ์–ธ์€ let๊ณผ const์ฒ˜๋Ÿผ ๋ธ”๋ก ์Šค์ฝ”ํ”„์— ์„ ์–ธ๋˜๋ฉฐ, ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์ •์˜ํ•œ ๋’ค์— ์‚ฌ์šฉํ•œ๋‹ค.
โ€ข ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ super ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข static ํ‚ค์›Œ๋“œ๋ฅผ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„ ์•ž์— ๋ถ™์—ฌ์ฃผ๋ฉด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ์ •์  ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
โ€ข Getter ํ˜น์€ Setter๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๋ฉ”์†Œ๋“œ ์ด๋ฆ„ ์•ž์— get ๋˜๋Š” set์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.
โ€ข extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์ƒ์†ํ•˜๋ฉด์„œ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•ด ๋‚˜๊ฐˆ์ˆ˜ ์žˆ๋‹ค.
โ€ข ํด๋ž˜์Šค์—์„œ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ• ๋‹นํ•˜๋ฉด Public Property(๊ณต๊ฐœ ํ”„๋กœํผํ‹ฐ)์ด๋‹ค. โ†’ ์™ธ๋ถ€์—์„œ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •์ด ๊ฐ€๋Šฅ
โ€ข ํด๋ž˜์Šค์—์„œ ํ”„๋กœํผํ‹ฐ ์•ž์— # ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์„ ์–ธํ•˜๋ฉด Private Property (๋น„๊ณต๊ฐœ ํ”„๋กœํผํ‹ฐ)๊ฐ€ ๋œ๋‹ค. โ†’ ์˜ค์ง ํด๋ž˜์Šค ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ, ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅ. ์™ธ๋ถ€ ์ ‘๊ทผ ๋ถˆ๊ฐ€

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  nextYearAge() {  // ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
    return Number(this.age) + 1;
  }
}

// ํด๋ž˜์Šค ์ƒ์†
class introducePerson extends Person {
  constructor(name, age, city, futureHope) {
    // super ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ž์‹ class์—์„œ ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
    super(name, age, city); 
    this.futureHope = futureHope
  }
  introduce () {
    return `์ €๋Š” ${this.city}์— ์‚ฌ๋Š” ${this.name} ์ž…๋‹ˆ๋‹ค.
	๋‚ด๋…„์—” ${super.nextYearAge()}์‚ด์ด๋ฉฐ,
	์žฅ๋ž˜ํฌ๋ง์€ ${this.futureHope} ์ž…๋‹ˆ๋‹ค.`
  }
}

let kim = new introducePerson('kim','23','seoul', '๊ฐœ๋ฐœ์ž'); 
console.log(kim.introduce())

6. ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น (destructing)

๊ฐ์ฒด์™€ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์‰ฝ๊ฒŒ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•  ์ˆ˜ ์ž‡๋‹ค.

๊ฐ์ฒด์—์„œ ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ key์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๊ณ , key์™€ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๊บผ๋‚ผ ๋•Œ๋Š” ๋ณ€์ˆ˜์ด๋ฆ„: ํ‚ค๊ฐ’์œผ๋กœ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

const introduce = {name: 'unknown', age: 23};
// key์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ
const { name, age } = introduce;
// ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ -> ๋ณ€์ˆ˜์ด๋ฆ„: ํ‚ค๊ฐ’
const { myName: name, myAge: age } = introduce;

console.log(myName) // unknown
console.log(myAge) // 23

๋ฐฐ์—ด์—์„œ ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ๋Š” ๋Œ€๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ž์—์„œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

const fruits = ['apple', 'mango', 'grape'];
// ์•ž์—์„œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ ๊ฐ€๋Šฅ
const [zero, one, two] = fruits;

console.log(zero) // apple

7. Rest Operator / Spread Operator

- Rest Operator(๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜)

Rest Operator(๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜)๋Š” ๋‚˜๋จธ์ง€ ํ›„์† ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์— ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฌถ์–ด์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜ ์•ž์— ...์„ ๋ถ™์—ฌ์„œ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
์ฆ‰, Rest Operator๋Š” ๋ฐฐ์—ด๊ณผ ํ•จ์ˆ˜์˜ ์ธ์ž ์ค‘ ๋‚˜๋จธ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, ๊ฐ์ฒด์˜ ๋‚˜๋จธ์ง€ ํ•„๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

// args์— 1,2,3,4,5๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ๋ฐฐ์—ด๋กœ ๋‹ด๊ฒจ ์ธ์ž๋กœ ๋„˜๊ฒจ์ง„๋‹ค.
function func1(...args) {
	console.log(`args: [${args}]`)
  // args: [1,2,3,4,5]
}
func1(1,2,3,4,5);

// arg1์—๋Š” 1, arg2์—๋Š” 2, arg3์—๋Š” ๋‚˜๋จธ์ง€ 3,4,5๊ฐ€ ๋ฐฐ์—ด๋กœ ๋‹ด๊ฒจ ์ธ์ž๋กœ ๋„˜๊ฒจ์ง„๋‹ค.
function func2(arg1, arg2, ...arg3) {
  	console.log(`arg1: ${arg1}, arg2: ${arg2}, arg3: [${arg3}]`)
  // arg1: 1, arg2: 2, arg3: [3,4,5]
}
func2(1,2,3,4,5);

func(์ธ์ž1, ์ธ์ž2, ...์ธ์ž๋“ค)๋กœ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋˜๋ฉด ์ธ์ž1, ์ธ์ž2์ฒ˜๋Ÿผ ์ง€์ •๋œ ์ธ์ž๋Š” ์•ž์—์„œ๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ๊ทธ ๋’ค์˜ ๋‚˜๋จธ์ง€ ํ›„์† ์ธ์ž๋“ค์„ ๋ฐฐ์—ด์— ์ธ์ž๋“ค๋กœ ๋ฌถ์–ด์„œ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

Rest Operator๋Š” ํ•จ์ˆ˜ ์ •์˜์—๋Š” ํ•˜๋‚˜์˜ ...๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜๋“œ์‹œ ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.

func(...wrong, arg2, arg3) 
// ํ‹€๋ฆฐ ์˜ˆ. ...wrong์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์™€์•ผ ํ•œ๋‹ค.

- Spread Operator(์ „๊ฐœ ๊ตฌ๋ฌธ)

Spread Operator(์ „๊ฐœ ๊ตฌ๋ฌธ)๋Š” ๋ฌถ์ธ ๋ฐฐ์—ด ํ˜น์€ ๊ฐ์ฒด๋ฅผ ๊ฐœ๋ณ„์ ์ธ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. ์ฆ‰, Rest์™€ ๋ฐ˜๋Œ€ ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ „๊ฐœํ•  ๋งค๊ฐœ๋ณ€์ˆ˜ ์•ž์— ...์„ ๋ถ™์—ฌ์„œ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
๋”ฐ๋ผ์„œ, ๋ฐฐ์—ด๊ณผ ํ•จ์ˆ˜์—์„  ๋˜ ๋‹ค๋ฅธ ๋ฐฐ์—ด๊ณผ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์˜ ์ „๊ฐœ๋ฅผ, ๊ฐ์ฒด์—์„  ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ์˜ ์ „๊ฐœ๋ฅผ ํ•œ๋‹ค.

let arr = [1, 2, 3, 4, 5]; 
console.log(...arr);
// 1 2 3 4 5

var str = 'javascript'; 
console.log(...str);
// "j" "a" "v" "a" "s" "c" "r" "i" "p" "t"

Spread Operator๋„ Rest Operator์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ...์˜ ์ž‘์„ฑ ์ˆœ์„œ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๋“ฑ์žฅ ์ˆœ์„œ์— ๋”ฐ๋ผ, ๋ฎ์–ด์”Œ์›Œ ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

var obj = { name: '์งฑ๊ตฌ', species: 'human'};
obj = { ...obj, age: 5}; 

console.log(obj)
// {name: "์งฑ๊ตฌ", species: "human", age: 5}

obj = { ...obj, name: '์งฑ์•„', age: 1};

console.log(obj);
// {name: "์งฑ์•„", species: "human", age: 11}

์œ„ ์˜ˆ์ œ์™€ ๊ฐ™์ด ...obj๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๊ณ  name๊ณผ age๊ฐ€ ๋‚˜์ค‘์— ๋“ฑ์žฅํ•จ์œผ๋กœ์จ ๋ฎ์–ด์”Œ์›Œ์ ธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, Rest Operator(๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜)๋Š” ๋ฐฐ์—ด๋กœ ๋ฌถ๋Š” ์—ญํ• ์„,
Spread Operator(์ „๊ฐœ ๊ตฌ๋ฌธ)๋Š” ๊ฐœ๋ณ„์ ์ธ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
๋‘˜ ๋‹ค "..." ์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ž‘์„ฑ ์ˆœ์„œ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.


8. forEach() / map() / reduce()

forEach()์™€ map()์€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ๋ฐฐ์—ด ์•ˆ์˜ ์š”์†Œ๋“ค์„ 1๋Œ€1๋กœ ์ง์ง€์–ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

- forEach() : ๋ฐฐ์—ด ์š”์†Œ๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜(์ฝœ๋ฐฑ)๋ฅผ ์‹คํ–‰

๋ฐฐ์—ด.forEach((์š”์†Œ, ์ธ๋ฑ์Šค, ๋ฐฐ์—ด) => { return ์š”์†Œ });

- map() : ๋ฐฐ์—ด ๋‚ด์˜ ๋ชจ๋“  ์š”์†Œ ๊ฐ๊ฐ์— ๋Œ€ํ•˜์—ฌ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜(์ฝœ๋ฐฑ)๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜

๋ฐฐ์—ด.map((์š”์†Œ, ์ธ๋ฑ์Šค, ๋ฐฐ์—ด) => { return ์š”์†Œ });

ํ•˜์ง€๋งŒ forEach()์™€ map()์€ ์—ญํ• ์€ ๊ฐ™์ง€๋งŒ, ๋ฆฌํ„ด๊ฐ’์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
forEach()๋Š” ๊ธฐ์กด์˜ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ˜๋ฉด, map()์€ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

var arr = [1,2,3,4,5];
// forEach()
var newArr = arr.forEach(function(e, i) {
  return e;
});
// return -> undefined

// map()
var newArr = arr.map(function(v, i, arr) {
  return v + 1;
});
// return -> 2, 3, 4, 5, 6

reduce() : ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ callbackํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฐ’์„ ๋ˆ„์ ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜

๋ฐฐ์—ด.reduce((๋ˆ„์ ๊ฐ’, ํ˜„์žฟ๊ฐ’, ์ธ๋ฑ์Šค, ์š”์†Œ) => { return ๊ฒฐ๊ณผ }, ์ดˆ๊นƒ๊ฐ’);

result = sum.reduce((prev, curr, i) => {
  console.log(prev, curr, i);
  return prev + curr;
}, 0);
// 0 1 0
// 1 2 1
// 3 3 2
result; // 6

* ์ดˆ๊นƒ๊ฐ’์„ ์ ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์ดˆ๊นƒ๊ฐ’์ด 0๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’์ด ๋œ๋‹ค.
* reduce()๋Š” ์ดˆ๊นƒ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ณ , ๋ฐฐ์—ด์— ๊ฐ’๋“ค์„ pushํ•˜๋ฉด map๊ณผ ๊ฐ™์•„์ง„๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ
๐Ÿฐ ์—˜๋ฆฌ์Šค SW ์—”์ง€๋‹ˆ์–ด ํŠธ๋ž™ 2๊ธฐ
๐Ÿ”— var, let, const ์ฐจ์ด์  / var, let, const์˜ ์ฐจ์ด
๐Ÿ”— ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด: ๋ฐฑํ‹ฑ(``), ๋‹ฌ๋Ÿฌ(${ }) ์‚ฌ์šฉ๋ฒ•
๐Ÿ”— ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๊ธฐ๋ณธ
๐Ÿ”— default export์™€ named export ์ฐจ์ด์ 
๐Ÿ”— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ Class ์‚ฌ์šฉํ•˜๊ธฐ
๐Ÿ”— ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜
๐Ÿ”— ์ „๊ฐœ ๊ตฌ๋ฌธ
๐Ÿ”— Spread Operator (์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž)
๐Ÿ”— forEach()์™€ map()์˜ ๋น„๊ต ๋ฐ ๋ถ„์„
๐Ÿ”— reduce() ํ™œ์šฉํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€