๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web/JavaScript

JavaScript ES6 & ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฌธ๋ฒ•

๐Ÿ“’ ์™œ? (์‚ฌ์šฉ ์ด์œ )

โ—ผ JavaScript๋กœ UI ๊ฐ™์€ ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, JavaScript ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋ ต๊ณ  ๋ถˆํŽธํ•œ ๋ฌธ๋ฒ•๋“ค์ด ๋งŽ๋‹ค.

โ—ผ ES6๋Š” JavaScript ๋ฒ„์ „(2015)์œผ๋กœ ๋Œ€๊ทœ๋ชจ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง„ํ–‰๋˜์–ด, JavaScript๋ฅผ ์กฐ๊ธˆ ๋” ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ๋ฌธ๋ฒ•๋“ค์„ ์ง€์›ํ•ด ์ค€๋‹ค.


๐Ÿ“’ Arrow function

<script>
  // ๋ฐฉ๋ฒ• 1
  function test1(data) {
    console.log(data);
  }

  // ๋ฐฉ๋ฒ• 2
  var test2 = (data) => {
    console.log(data);
  };
  
  // ๋ฐฉ๋ฒ• 2์™€ ๊ฐ™์€ ์ฝ”๋“œ
  var test2 = data => console.log(data);

</script>

โ—ผ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์œ„ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

โ—ผ function ํ‚ค์›Œ๋“œ ๋Œ€์‹  ES6์˜ Arrow function์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐฉ๋ฒ• 2์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

โ—ผ this ๊ฐ’์„ ์žฌ์ •์˜ ํ•˜์ง€ ์•Š์•„๋„ ๋  ๋•Œ, ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

โœ” Arrow fucntion์˜ ์žฅ์ 

โ—ผ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.

โ—ผ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ 1๊ฐœ ์žˆ์„ ๋•Œ, ์†Œ๊ด„ํ˜ธ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์ด๋ฉด {}๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“’ ๋ณ€์ˆ˜

โ—ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜ ํ‚ค์›Œ๋“œ๋Š” var, let, const๊ฐ€ ์กด์žฌํ•œ๋‹ค.

โ—ผ ์„ ์–ธ, ํ• ๋‹น, ๋ฒ”์œ„, ํ˜ธ์ด์ŠคํŒ… 4๊ฐ€์ง€๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

โ—ผ ํ˜ธ์ด์ŠคํŒ…์€ var ํ‚ค์›Œ๋“œ์™€ ํ•จ์ˆ˜์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

 

โœ” var ํ‚ค์›Œ๋“œ

// ์žฌ์„ ์–ธ
var a = 1;
var a = 1; // ๊ฐ€๋Šฅ

// ์žฌํ• ๋‹น
a = 3; // ๊ฐ€๋Šฅ 

// ๋ฒ”์œ„
function asc() {
  var b = 1;
}

console.log(b); // ์—๋Ÿฌ ๋ฐœ์ƒ

if (true) {
  var c = 1;
}

console.log(c); // 1

// ํ˜ธ์ด์ŠคํŒ…
console.log(d); // undefined
var d = 1;

โ—ผ ์žฌ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—ผ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—ผ ๋ฒ”์œ„(์Šค์ฝ”ํ”„)๋Š” function์ด๋‹ค.

โ—ผ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค.

    โ— ํ˜ธ์ด์ŠคํŒ…์ด๋ž€, ์„ ์–ธ๋ถ€๋ฅผ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. * ํ• ๋‹น์€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

   ๐Ÿ’ฅ ํ˜ธ์ด์ŠคํŒ…์œผ๋กœ ์ธํ•ด ์œ„ ์ฝ”๋“œ์˜ d ๋ณ€์ˆ˜ ๋ถ€๋ถ„์ด ๋‹ค์Œ๊ณผ ๊ฐ™์•„์ง„๋‹ค.

var d;
console.log(d);
d = 1;

 

โœ” let ํ‚ค์›Œ๋“œ

// ์žฌ์„ ์–ธ
let a = 1;
let a = 1; // ๋ถˆ๊ฐ€๋Šฅ

// ์žฌํ• ๋‹น
a = 3; // ๊ฐ€๋Šฅ

// ๋ฒ”์œ„
function asc() {
  let b = 1;
}

console.log(b); // ์—๋Ÿฌ ๋ฐœ์ƒ

if (true) {
  let c = 1;
}

console.log(c); // ์—๋Ÿฌ ๋ฐœ์ƒ

// ํ˜ธ์ด์ŠคํŒ…
console.log(d); // ์—๋Ÿฌ ๋ฐœ์ƒ
var d = 1;

โ—ผ ์žฌ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—ผ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—ผ ๋ฒ”์œ„(์Šค์ฝ”ํ”„)๋Š” block์ด๋‹ค.

โ—ผ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

โœ” const ํ‚ค์›Œ๋“œ

// ์žฌ์„ ์–ธ
const a = 1;
const a = 1; // ๋ถˆ๊ฐ€๋Šฅ

// ์žฌํ• ๋‹น
a = 3; // ๋ถˆ๊ฐ€๋Šฅ

// ๋ฒ”์œ„
function asc() {
  let b = 1;
}

console.log(b); // ์—๋Ÿฌ ๋ฐœ์ƒ

if (true) {
  let c = 1;
}

console.log(c); // ์—๋Ÿฌ ๋ฐœ์ƒ

// ํ˜ธ์ด์ŠคํŒ…
console.log(d); // ์—๋Ÿฌ ๋ฐœ์ƒ
var d = 1;

โ—ผ ์žฌ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—ผ ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—ผ ๋ฒ”์œ„(์Šค์ฝ”ํ”„)๋Š” block์ด๋‹ค.

โ—ผ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

const arr = [1, 2, 3];

const obj = {
  name: "choi",
};

arr[3] = 4; // ๊ฐ€๋Šฅ
obj.age = 10; // ๊ฐ€๋Šฅ

console.log(arr);
console.log(obj);

โ—ผ Object, Array์—์„œ๋Š” ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

const arr = [1, 2, 3];

const obj = {
  name: "choi",
};

Array.freeze(arr);
Object.freeze(obj);

arr[3] = 4; // ๋ถˆ๊ฐ€๋Šฅ
obj.age = 10; // ๋ถˆ๊ฐ€๋Šฅ

โ—ผ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•œ Object, Array๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Object.freeze({Object ๋ช…}), Array.freeze({Array ๋ช…})์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ strict ๋ชจ๋“œ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๐Ÿ’ฌ JavaScript์—์„œ ์ „์—ญ ๋ณ€์ˆ˜ ๋งŒ๋“ค๊ธฐ

// ๋ฐฉ๋ฒ• 1
<script>
  var a = 1; // ์ „์—ญ ๋ณ€์ˆ˜
  let b = 2; // ์ „์—ญ ๋ณ€์ˆ˜
  const c = 3; // ์ „์—ญ ๋ณ€์ˆ˜
  
  console.log(window.a); // 1
  console.log(window.b); // undefined
  console.log(window.c); // undefined
</script>

// ๋ฐฉ๋ฒ• 2
<script>
  window.a = 1; // ์ „์—ญ ๋ณ€์ˆ˜
  window.b = 2; // ์ „์—ญ ๋ณ€์ˆ˜
  window.c = 3; // ์ „์—ญ ๋ณ€์ˆ˜
</script>

โ—ผ ์œ„์™€ ๊ฐ™์ด JavaScript์—์„œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ฅ ๋‹จ, 1๋ฒˆ ๋ฐฉ๋ฒ•์—์„œ var a๋Š” window.a๋กœ ํ• ๋‹น๋˜์ง€๋งŒ, let๊ณผ const๋Š” window.b, window.c๋กœ ํ• ๋‹น๋˜์ง€ ์•Š๋Š”๋‹ค.

// ์—๋Ÿฌ ๋ฐœ์ƒ
<script>
  function test() {
    var a = 10;
  }
  test();
  console.log(a); // ์—๋Ÿฌ ๋ฐœ์ƒ
</script>

// ์ •์ƒ ์ถœ๋ ฅ
<script>
  function test() {
    window.a = 10;
  }
  test();
  console.log(a); // 10 
</script>

โ—ผ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ ํ˜„์ƒ ๋•Œ๋ฌธ์—, ์ „์—ญ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ์‹œ, window.{์ „์—ญ ๋ณ€์ˆ˜ ๋ช…} ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

๐Ÿ’ฅ ์กฐ์‹ฌํ•ด์•ผ ํ•  ์ƒํ™ฉ

<script>
  for (var i = 0; i < 10; i++) {
    setTimeout(() => {
      console.log(i);
    }, 1000);
  }
</script>

โ—ผ ์œ„ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋กœ 1์ดˆ ํ›„์—, 1๋ถ€ํ„ฐ 10๊นŒ์ง€ ์ถœ๋ ฅ๋˜๊ธธ ์›ํ–ˆ์ง€๋งŒ ์‹ค์ œ ์ถœ๋ ฅ ๊ฐ’์€ 10์ด 10๋ฒˆ ์ถœ๋ ฅ๋œ๋‹ค.

โ—ผ ์‹ค์ œ๋กœ console.log()๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์€ 1์ดˆ ํ›„์ด๊ณ , var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ i๋Š” function ์Šค์ฝ”ํ”„๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, 1์ดˆ ํ›„์—๋Š” ๋ชจ๋“  for๋ฌธ ๋Œ์•„ i ๊ฐ’์ด 10์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋กœ console.log()๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค.

โ—ผ for ๋ฌธ์—์„œ๋Š” var ํ‚ค์›Œ๋“œ๋กœ i๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•ด์„œ block ๋ฒ”์œ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


๐Ÿ“’ template literals (strings)

โ—ผ ES6 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅด๊ฒŒ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

โ—ผ `(๋ฐฑํ‹ฑ)์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

โœ” ์žฅ์ 

// ์—”ํ„ฐํ‚ค
let a = `Hello
Enter`;
console.log(a); // Hello
                // Enter

// ๋ณ€์ˆ˜ ๋„ฃ๊ธฐ
let age = 10;
console.log(`choi์˜ ๋‚˜์ด๋Š” ${age}์‚ด์ด๋‹ค.`); // choi์˜ ๋‚˜์ด๋Š” 10์‚ด์ด๋‹ค.

// ํ•จ์ˆ˜ ๋„ฃ๊ธฐ
let age = function () {
return 10;
};
console.log(`choi์˜ ๋‚˜์ด๋Š” ${age()}์ด๋‹ค.`); // choi์˜ ๋‚˜์ด๋Š” 10์‚ด์ด๋‹ค.

// ํ•ด์ฒดํ•˜๊ธฐ
let name = "choi";
let age = 10;

function separator(strs, var1, var2) {
  console.log(strs); // ["์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋Š” ", "์ด๋ฉฐ, ", "์‚ด์ž…๋‹ˆ๋‹ค."]
  console.log(var1); // choi
  console.log(var2); // 10
}

separator`์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋Š” ${name}์ด๋ฉฐ, ${age}์‚ด์ž…๋‹ˆ๋‹ค.`;

โ—ผ ์—”ํ„ฐํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—”ํ„ฐ๊ฐ€ ์ ์šฉ๋œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ${}๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๋ฌธ์ž์—ด ์ค‘๊ฐ„์— ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ``์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๋ฌธ์ž์—ด์„ ๋ณ€์ˆ˜ ๊ธฐ์ค€์œผ๋กœ ํ•ด์ฒดํ•ด์„œ ์›ํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ ์žฌ์กฐ๋ฆฝํ•˜๊ธฐ ์‰ฝ๋‹ค.


๐Ÿ“’ Spread Operator

โ—ผ ...(Spread Operator)์„ ์‚ฌ์šฉํ•ด์„œ ํŽผ์ณ์„œ ๋Š˜์—ฌ ํŠธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ๋ณ€์ˆ˜ ์™ผ์ชฝ์— ๋ถ™์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

โ—ผ ํ•ญ์ƒ ์†Œ๊ด„ํ˜ธ( () ), ์ค‘๊ด„ํ˜ธ( {} ), ๋Œ€๊ด„ํ˜ธ( [] ) ์•ˆ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

โœ” ์‚ฌ์šฉ๋ฒ•

// ๋ณ€์ˆ˜ ๋Š˜์—ฌ ํŠธ๋ฆฌ๊ธฐ
var arr = ["Hello", "World!"];
console.log(...arr); // Hello World!

var str = "Hello";
console.log(...str); // H e l l o

โ—ผ ๋ฐฐ์—ด์— ์‚ฌ์šฉํ•˜๋ฉด ์›์†Œ ๊ธฐ์ค€์œผ๋กœ ๊ณต๋ฐฑ์ด ๋ถ™๊ณ , ํ•ฉ์ณ์ง„๋‹ค.

 

// Array, Object ํ•ฉ์น˜๊ธฐ
var arr1 = [1, 2, 3];
var arr2 = [4, 5];

var arr3 = [...arr1, ...arr2];
console.log(arr3); // [1, 2, 3, 4, 5]

var o1 = { a: 1, b: 2 };
var o2 = { ...o1, c: 3 };
console.log(o2); // {a: 1, b: 2, c: 3}

โ—ผ ๋ฌธ์ž์—ด๋„ Array ์ฒ˜๋Ÿผ ์ธ๋ฑ์‹ฑ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ฉด, ๋ฌธ์ž๋“ค๋กœ ๋‚˜๋‰œ๋‹ค.

 

// Deep Copy
var arr1 = [1, 2, 3];
var arr2 = arr1; // shallow copy
var arr2 = [...arr1] // deep copy

var o1 = { a: 1, b: 2 };
var o2 = { ...o1 };
console.log(o2); // {a: 1, b: 2}

โ—ผ Array, Object์„ ํ•ฉ์น˜๊ฑฐ๋‚˜, Deep Copy์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.

   ๐Ÿ’ฅ ๋‹จ, Object์˜ Deep Copy์—์„œ o1๊ฐ€ {a: 1} ์ผ ๋•Œ, o2 = {a: 3, ...o1}๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, o2 = {a: 1}์ด ๋œ๋‹ค. ๋’ค์— ์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๋ฎ์–ด ์”Œ์›Œ์ง„๋‹ค.

 

// ์ธ์ž๋กœ ๋„˜๊ธฐ๊ธฐ
var arr1 = [1, 2, 3];

function test(a, b, c) {
  console.log(a + b + c);
}

test(...arr1);

โ—ผ Array๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธธ ๋•Œ Spread Operator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์›์†Œ ํ•˜๋‚˜์”ฉ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ Object์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.


๐Ÿ“’ ES6 ํ•จ์ˆ˜์— ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ

โœ” dafult parameter

// ๊ฐ’
function add(a, b = 10) {
  console.log(a + b);
}

add(1); // 11

// ์‹
function add(a, b = 10 + 5) {
  console.log(a + b);
}

add(1); // 16

// ๋ณ€์ˆ˜
function add(a, b = 10 + a) {
  console.log(a + b);
}

add(1); // 12


// ํ•จ์ˆ˜
function defaultValue() {
  return 10;
}

function add(a, b = defaultValue()) {
  console.log(a + b);
}

add(1); // 11

// ํŒŒ๋ผ๋ฏธํ„ฐ 2๊ฐœ ๋„˜์–ด์™”์„ ๋•Œ
function add(a, b = 10) {
  console.log(a + b);
}

add(1, 4); // 5

โ—ผ ๊ธฐ์กด JavaScript์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ 2๊ฐœ ๋ฐ›๋Š” ํ•จ์ˆ˜์—์„œ 1๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋„˜์–ด์™€๋„ ์ •์ƒ ์‹คํ–‰๋˜์—ˆ๋‹ค.

โ—ผ ES6 ์ดํ›„ ๋ถ€ํ„ฐ๋Š” default ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ 2๊ฐœ ๋„˜๊ฒผ์„ ๋•Œ๋Š” default parameter์˜ ๊ฐ’์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

โœ” ํ•จ์ˆ˜์˜ arguments

function printParameters(a, b, c) {
  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2
  console.log(arguments[2]); // 3
}

printParameters(1, 2, 3);

โ—ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

function printParameters(a, b, c) {
  for (let i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
}

printParameters(1, 2, 3);

โ—ผ ์œ„์™€ ๊ฐ™์ด ์กฐ๊ธˆ ํ™•์žฅ์„ฑ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ” rest parameter

function print(...arr) {
  for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
  }
}

print(1, 2, 3);

function print(a, b, ...arr) {
  console.log(a); // 1
  console.log(b); // 2
  for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]); // 3 // 4 // 5
  }
}

print(1, 2, 3, 4, 5);

โ—ผ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ž๋ฆฌ์— ...์ด ๋ถ™์œผ๋ฉด rest parameter์ด๋‹ค.

โ—ผ ์ธ์ž๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๋”ฐ๋กœ ๋„˜๊ธธ ๋•Œ, rest parameter๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ›์œผ๋ฉด ๊ฐ ๊ฐ’๋“ค์ด Array ์š”์†Œ๋กœ ์ €์žฅ๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ์ธ์ž๋กœ ๋ช‡ ๊ฐœ์˜ ๊ฐ’์ด ๋„˜์–ด์˜ฌ์ง€ ๋ชจ๋ฅผ ๋•Œ, ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๊ณ  ํ•จ์ˆ˜์˜ arguments๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ข‹๋‹ค.

๐Ÿ’ฅ rest parameter๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋งˆ์ง€๋ง‰์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


๐Ÿ“’ Data Type

โœ” primitive data type

"abc"
10
true
undefined
null

โ—ผ ์ข…๋ฅ˜๋Š” number, string, boolean, null, undefined๊ฐ€ ์žˆ๋‹ค.

โ—ผ primitive data type์€ ๋ณ€์ˆ˜์— ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ €์žฅ๋œ๋‹ค.

 

โœ” reference data type

[1, 2, 3]
{name: "choi"}

โ—ผ ์ข…๋ฅ˜๋Š” array, object๊ฐ€ ์žˆ๋‹ค.

โ—ผ reference data type์€ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ฐธ์กฐ ์ฃผ์†Œ ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค.

 

๐Ÿ’ฅ ๊ณ ๋ ค ์‚ฌํ•ญ

// primitive data type
let a = 10;
let b = a;
b = 20;
console.log(a) // 10

// reference data type
let obj1 = {age: 10};
let obj2 = obj1;
obj2.age = 20;
console.log(obj1.age) // 20

โ—ผ primitive data type์€ b = a;์—์„œ a์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด b์— ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ, b์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ a์˜ ๊ฐ’์€ ๋ณ€ํ•จ์—†์ด 10์ด ์ถœ๋ ฅ๋œ๋‹ค.

โ—ผ reference data type์€ obj2 = obj1;์—์„œ obj1์˜ ์ฐธ์กฐ ์ฃผ์†Œ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด obj2์— ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ, obj1์™€ obj2๋Š” ๊ฐ™์€ ์ฐธ์กฐ ๊ณต๊ฐ„์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, obj2์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด obj1์˜ ๊ฐ’๋„ ๋ณ€๊ฒฝ๋˜์–ด 20์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

// ์ƒํ™ฉ 1
var obj1 = {name: "choi"}

function change(obj) {
  obj = {name: "kim"};
}

change(obj1);
console.log(obj1.name) // choi

// ์ƒํ™ฉ 2
var obj1 = {name: "choi"}

function change(obj) {
  obj.name = "kim";
}

console.log(obj1.name) // kim

โ—ผ ์ƒํ™ฉ 1) JavaScript๋Š” Call By Value์ด๊ธฐ ๋•Œ๋ฌธ์—, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์ฐธ์กฐ ์ฃผ์†Œ ๊ฐ’์„ obj๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ๋ณต์‚ฌํ•ด์„œ ํ• ๋‹นํ•œ๋‹ค. ์ดํ›„, obj์— ๋‹ค๋ฅธ Object๋ฅผ ๋Œ€์ž…ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, obj์™€ obj1์€ ๋‹ค๋ฅธ ์ฐธ์กฐ ์ฃผ์†Œ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด change ํ•จ์ˆ˜ ํ›„ obj1.name ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด "choi"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

โ—ผ ์ƒํ™ฉ 2) ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์ฐธ์กฐ ์ฃผ์†Œ ๊ฐ’์„ obj๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ๋ณต์‚ฌํ•ด์„œ ํ• ๋‹นํ•œ๋‹ค. obj.name = "kim"์ด ๋™์ž‘ํ•  ๋•Œ, obj์—๋Š” obj1์˜ ์ฐธ์กฐ ์ฃผ์†Œ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, obj1๊ณผ ๊ฐ™์€ ์‹ค์ œ ๊ฐ’์˜ name์„ "kim"์œผ๋กœ ๋ฐ”๊พผ๋‹ค. chage ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„ obj1.name์„ ์ถœ๋ ฅํ•˜๋ฉด "kim"์ด ์ถœ๋ ฅ๋œ๋‹ค.


๐Ÿ“’ Symbol

let person = { name: "choi" };
let age = Symbol("๋‚˜์ด");

person[age] = 10;
console.log(person); // {name: 'choi', Symbol(๋‚˜์ด): 10}
console.log(person.age); // undefined
console.log(person[age]); // 10

for (let key in person) {
  console.log(key); // name๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.
}

โ—ผ  ์‹ค์šฉ์ ์ธ ์ž๋ฃŒํ˜•์€ ์•„๋‹ˆ๋‹ค.

โ—ผ  Symbol์˜ ์šฉ๋„๋Š” Object ์ž๋ฃŒํ˜•์˜ ๋น„๋ฐ€์Šค๋Ÿฌ์šด key ๊ฐ’์ด๋‹ค. (๋น„๊ณต๊ฐœ)

โ—ผ  Object key ๊ฐ’์œผ๋กœ Symbol์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

โ—ผ  person.age๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 10์ด๋ผ๋Š” ๊ฐ’์ด ์•„๋‹Œ, undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

โ—ผ  symbol์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ,enumerableํ•˜์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ, person์— ๋Œ€ํ•ด์„œ for ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด, name์ด๋ผ๋Š” key ๊ฐ’๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.


๐Ÿ“’ Map & Set

โœ” Map

let map = new Map();

map.set("name", "choi");
map.set(100, "age");
console.log(map); // Map(2) {'name' => 'choi', 100 => 'age'}

console.log(map.get("name")); // choi

โ—ผ key, value๋ฅผ ์ €์žฅํ•˜๋Š” Map ์ž๋ฃŒํ˜•

โ—ผ Map ์ž๋ฃŒํ˜•์€ ์ž๋ฃŒ ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ/์˜์กด์„ฑ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, "name" => "choi" ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

โ—ผ Object ์ž๋ฃŒํ˜•์—์„œ key ๊ฐ’์€ ๋ฌธ์ž์—ด๋งŒ ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, Map์€ ๋ชจ๋“  ์ž๋ฃŒํ˜•์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

โœ” Set

let set = new Set(["a", "a"]);
set.add("a");

console.log(set); // Set(1) {'a'}
console.log(set.has("a")); // true
console.log(set.size); // 1

โ—ผ ์ค‘๋ณต ์ž๋ฃŒ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” Array์™€ ๋น„์Šทํ•œ ์ž๋ฃŒํ˜•


๐Ÿ“’ ?. & ??

โœ” ?. (optional chaining)

let user = {
  name: "choi",
};

console.log(user.age.value); // Reference Error
console.log(user.age?.value); // undefined

โ—ผ ?. ์™ผ์ชฝ์ด null ์ด๊ฑฐ๋‚˜ undefined๋ฉด ์˜ค๋ฅธ์ชฝ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  undefined๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

โ—ผ ์ค‘์ฒฉ Object์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ํ•œ ์ฝ”๋“œ์— .์ด 2๋ฒˆ ์ด์ƒ ์žˆ์„ ๊ฒฝ์šฐ 2๋ฒˆ ์งธ .๋ถ€ํ„ฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

โœ” ?? (nullish coalescing)

let user = {
  name: "choi",
};

console.log(user.age ?? 10); // 10

โ—ผ ?? ์™ผ์ชฝ์ด null์ด๊ฑฐ๋‚˜ undefined๋ฉด ์˜ค๋ฅธ์ชฝ์„ ์‹คํ–‰ํ•œ๋‹ค.


๐Ÿ“’ ๊ฐ์ฒด ์ง€ํ–ฅ

๐Ÿ’ฌ ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฌธ๋ฒ•์€Object๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ๋•Œ, ์กฐ๊ธˆ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ’ฅ ES6 ๋ฌธ๋ฒ• ์ด์ „

โœ” constructor

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.say = function () {
    console.log(`๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ${this.age} ์ž…๋‹ˆ๋‹ค.`);
  };
}

let person1 = new Person("choi1", 10);
let person2 = new Person("choi2", 20);
let person3 = new Person("choi3", 30);

person1.say(); // ๋‚ด ์ด๋ฆ„์€ choi1 ์ด๊ณ , ๋‚˜์ด๋Š” 10 ์ž…๋‹ˆ๋‹ค.
person2.say(); // ๋‚ด ์ด๋ฆ„์€ choi2 ์ด๊ณ , ๋‚˜์ด๋Š” 20 ์ž…๋‹ˆ๋‹ค.
person3.say(); // ๋‚ด ์ด๋ฆ„์€ choi3 ์ด๊ณ , ๋‚˜์ด๋Š” 30 ์ž…๋‹ˆ๋‹ค.

โ—ผ constructor๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์‚ฌ์šฉํ•œ๋‹ค.

โ—ผ ์—ฌ๊ธฐ์„œ this๋Š” ์ƒˆ๋กœ์šด Object๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

โ—ผ ์ž๋ฐ”์ฒ˜๋Ÿผ Class๋ฅผ ์ •์˜ํ•˜๊ณ  ์ƒ์„ฑ์ž(constructor)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ƒ์„ฑ์ž๋งŒ ๊ฐ€์ง€๊ณ  Object(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ” prototype

function Person(name) {
  this.name = name;
  this.age = 10;
  this.say = function () {
    console.log(`๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ${this.age} ์ž…๋‹ˆ๋‹ค.`);
  };
}

console.log(Person.prototype);

โ—ผ prototype์€ ์ƒ์†์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” JavaScript์˜ ๋ฌธ๋ฒ•์ด๋‹ค.

โ—ผ constructor๋ฅผ ๋งŒ๋“ค๋ฉด prototype์ด๋ผ๋Š” ๊ณต๊ฐ„์ด ์ž๋™์œผ๋กœ ์ƒ๊ธด๋‹ค.

โ—ผ Person์ด๋ผ๋Š” constructor๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, prototype์„ ์ถœ๋ ฅํ•˜๋ฉด ํŠน์ • ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.

โ—ผ prototype์ด๋ผ๋Š” ๊ณต๊ฐ„์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ๋ชจ๋“  ์ž์‹๋“ค์ด ๋ฌผ๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

โ—ผ prototype์€ ํ•จ์ˆ˜์—๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

 

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.say = function () {
    console.log(`๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ${this.age} ์ž…๋‹ˆ๋‹ค.`);
  };
}

let person1 = new Person("choi", 10);
let person2 = new Person("choi2", 20);
console.log(person1.country);
console.log(person2.country);

Person.prototype.country = "ko";
console.log(person1.country);
console.log(person2.country);

โ—ผ ์œ„ ์˜ˆ์ œ์™€ ๊ฐ™์ด, new Person()์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, ์ถ”ํ›„ new Person() ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ์œ ์šฉํ•˜๋‹ค.

๐Ÿ’ฌ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š”, person1.country ์ฝ”๋“œ์— ๊ฒฝ์šฐ JavaScript๋Š” person1์ด ์ง์ ‘ name์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด  prototype ๊ณต๊ฐ„์„ ํ™•์ธํ•ด์„œ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ์ถœ๋ ฅํ•œ๋‹ค. person1.toString() ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” Person ๊ฐ์ฒด์— ๊ฐ’๋„ ์—†๊ณ , prototype์—๋„ ์—†์–ด, ๊ทธ ์ƒ์œ„์ธ Object.prototype์— ์กด์žฌํ•˜๋Š” toString()์„ ์‹คํ–‰ํ•ด ์ค€๋‹ค.

 

๐Ÿ’ฅ ES6 ๋ฌธ๋ฒ• ์ดํ›„

โœ” class

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
    this.say = function () { // 1๋ฒˆ
      console.log(`1. ๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ${this.age} ์ž…๋‹ˆ๋‹ค.`);
    };
  }

  say() { // 2๋ฒˆ
    console.log(`2. ๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ${this.age} ์ž…๋‹ˆ๋‹ค.`);
  }
}

let person1 = new Person("choi", 10);
console.log(person1.name); // choi

person1.say(); // 1. ๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ${this.age} ์ž…๋‹ˆ๋‹ค.

โ—ผ Class๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ 1๋ฒˆ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ 2๋ฒˆ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

   โ— 1๋ฒˆ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, Person์ด๋ผ๋Š” Object์— ํฌํ•จ๋œ ํ•จ์ˆ˜๋กœ์จ ์ž‘๋™ํ•œ๋‹ค. ์ฆ‰, ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹ค์ œ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

   โ— 2๋ฒˆ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, Person์˜ prototype ๊ณต๊ฐ„์— ํฌํ•จ๋œ ํ•จ์ˆ˜๋กœ์จ ์ž‘๋™ํ•œ๋‹ค. ์ฆ‰, ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹ค์ œ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์•„๋‹Œ Person ํด๋ž˜์Šค์˜ prototype ๊ณต๊ฐ„์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

โ—ผ ๋”ฐ๋ผ์„œ, person1.say() ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, Object์˜ ์‹ค์ œ ๊ฐ’๋ถ€ํ„ฐ ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

โœ” extends

class Dog {
  constructor(type, characteristic) {
    this.type = type;
    this.characteristic = characteristic;
    this.burk = function () {
      console.log("Bow-wow!!");
    };
  }

  print() {
    console.log("print");
  }
}

class Bulldog extends Dog {
  constructor(something) {
    super("Bulldog", "strong");
    this.something = something;
  }
}

class Poodle extends Dog {
  constructor() {
    super("Poodle", "cute");
  }

  print() {
    console.log("i`m poodle");
  }
}

let bulldog = new Bulldog("something");
console.log(bulldog.type); // Bulldog
console.log(bulldog.something); // something
bulldog.burk(); // Bow-wow!!
bulldog.print(); // print

let poodle = new Poodle();
console.log(poodle.type); // Poodle
poodle.burk(); // Bow-wow!!
poodle.print(); // i`m poodle

โ—ผ class ์ƒ์†์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

โ—ผ class์˜ ๊ฐ’์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ, ๋ณ„๋„์˜ ์ถ”๊ฐ€์ ์ธ class ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•  ๋•Œ, ์ƒ์†์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค.

โ—ผ extends ํ•ด์„œ ๋งŒ๋“  class๋Š” constructor ๋‚ด๋ถ€์—์„œ super ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ ๊ฐ์ฒด์˜ constructor๋„ ํ˜ธ์ถœํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

โ—ผ print ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, Dog ํด๋ž˜์Šค์˜ prototype ๊ณต๊ฐ„์— ์ €์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, bulldog ๋ณ€์ˆ˜์—์„œ print ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Dog์˜ print๊ฐ€ ํ˜ธ์ถœ๋˜์ง€๋งŒ, poodle์˜ ๊ฒฝ์šฐ print ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, "i`m poodle"์ด ์ถœ๋ ฅ๋œ๋‹ค. Java์˜ IOverride๋ž‘ ๋™์ผํ•˜๋‹ค.


๐Ÿ“’ Destructuring

โœ” Array, Object -> ๋ณ€์ˆ˜

let arr = [1, 2, 3];

// ๊ธฐ์กด
let a = arr[0];
let b = arr[1];
let c = arr[2];

// destructing (Array)
let [a, b, c] = arr;

console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

// destructing (Object)
let obj = { name: "choi", age: 10 };
let { name, age } = obj;

console.log(name);
console.log(age);

โ—ผ ๋ชจ์–‘( [] ) ๋งž์ถฐ์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  Array๋ฅผ ๋Œ€์ž…ํ•˜๋ฉด, ๊ฐ ๋ณ€์ˆ˜์˜ ์ˆœ์„œ์— ๋งž๋Š” Array ์ธ๋ฑ์Šค ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.

โ—ผ ๋ชจ์–‘( {} ) ๋งž์ถฐ์„œ key ๊ฐ’์„ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์„ ์–ธํ•˜๊ณ  Object๋ฅผ ๋Œ€์ž…ํ•˜๋ฉด, ๊ฐ ๋ณ€์ˆ˜์— ๋งž๋Š” Object  value ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.

 

โœ” default ๊ฐ’ ์ง€์ •

// Array
let arr = [1, 2];
let [a, b, c = 3, d] = arr;

console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
console.log(d); // undefined

// Object
let obj = { name: "choi", age: 10 };
let { name, age, type = "person", something } = obj;

console.log(name);
console.log(age);
console.log(type);
console.log(something);

โ—ผ default ๊ฐ’๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ default ๊ฐ’๋„ ์—†์„ ๊ฒฝ์šฐ์—๋Š” undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

โœ” ๋ณ€์ˆ˜ -> Object

let name = "choi";
let age = 10;

let person = { name, age };
console.log(person.name); // choi
console.log(person.age); // 10

โ—ผ ๋ฐ˜๋Œ€๋กœ Object๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ๋„ฃ์„ ๊ฒฝ์šฐ, ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด key ๊ฐ’, ๋ณ€์ˆ˜์˜ ๊ฐ’์ด value ๊ฐ’์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

 

โœ” ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ธฐ

// Array
let arr = [1, 2, 3];

function print([a, b, c]) {
  console.log(a); // 1
  console.log(b); // 2
  console.log(c); // 3
}

print(arr);


// Object
let person = { name: "choi", age: 10 };

function print({ name, age }) {
  console.log(name); // choi
  console.log(age); // 10
}

print(person);

โ—ผ { }๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Object์˜ key ๊ฐ’์˜ value ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“’ import & export

โœ” preview.js ํŒŒ์ผ์„ preview.html ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

// ๊ธฐ์กด
<script src="preview.js"></script>

// import & export
/* preview.html ํŒŒ์ผ */
<script type="module">
  import a from "/preview.js";
  console.log(a); // 10
</script>

<script type="module">
  import exportVal from "/preview.js";
  console.log(exportVal); // 10
</script>

/* preview.js ํŒŒ์ผ */
let a = 10;

export default a;

โ—ผ import { ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ช… } from {๊ฒฝ๋กœ} ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น js ํŒŒ์ผ์—์„œ ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

โ—ผ export default { ๋‚ด๋ณด๋‚ผ ๊ฒƒ } ์„ ์‚ฌ์šฉํ•ด์„œ js ํŒŒ์ผ์—์„œ ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

โ—ผ import ์—์„œ์˜ a๋Š” ์ž‘๋ช… ๋ถ€๋ถ„์œผ๋กœ export ํ•œ a ๋Œ€์‹  ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•ด๋„ a์˜ ๊ฐ’์ด ์ž˜ ์ถœ๋ ฅ๋œ๋‹ค.

 

/* preview.html ํŒŒ์ผ */
<script type="module">
  import { a, b } from "/preview.js";
  console.log(a); // 10
  console.log(b); // 20
</script>

/* preview.js ํŒŒ์ผ */
let a = 10;
let b = 20;

export { a, b };

โ—ผ export default๋Š” ํŒŒ์ผ ๋‹น 1ํšŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โ—ผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด export { {๋‚ด๋ณด๋‚ผ ๊ฒƒ}... } ์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

โ—ผ html ํŒŒ์ผ์—์„œ ๋ฐ›์„ ๋•Œ, ๋‚ด๋ณด๋‚ธ ๊ฒƒ์˜ ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

 

/* preview.html ํŒŒ์ผ */
<script type="module">
  import exportDefaultVal, { a, b as other} from "/preview.js";
  console.log(a); // 10
  console.log(other); // 20
  console.log(exportDefaultVal); // 30
</script>

/* preview.js ํŒŒ์ผ */
let a = 10;
let b = 20;
let c = 30;

export { a, b };
export default c;

โ—ผ export, export default๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ import ํ•  ๋•Œ๋Š” export default ๊ฐ’ ๋ถ€ํ„ฐ ๋ฐ›์€ ํ›„ ,(์ฝค๋งˆ)์™€ {}๋ฅผ ์‚ฌ์šฉํ•ด์„œ export ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ export ํ•œ ๋ณ€์ˆ˜๋ฅผ html ํŒŒ์ผ์—์„œ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด, as๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

/* preview.html ํŒŒ์ผ */
<script type="module">
  import exportDefaultVal, * as obj from "/preview.js";
  console.log(obj.a); // 10
  console.log(obj.b); // 20
  console.log(exportDefaultVal); // 30
</script>

/* preview.js ํŒŒ์ผ */
let a = 10;
let b = 20;
let c = 30;

export { a, b };
export default c;

โ—ผ import ์‹œ *์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  export ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๊ณ  as obj๋กœ ๋ณ€์ˆ˜๋ช…์„ ๋ณ€๊ฒฝํ•˜์—ฌ Object ํ˜•์‹์œผ๋กœ ๋ณ€์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ฅ ๋ณ„๋„์˜ js ํŒŒ์ผ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ณ  ์‹ถ์„ ๋•Œ๋Š” <script src={๊ฒฝ๋กœ} /> ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ์ผ ํ˜ธํ™˜์„ฑ ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ React, Angular ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋–„๋Š” ํ•ด๋‹น ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ์“ด๋‹ค.


๐Ÿ“’ Promise

โ—ผ JavaScript์—์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋˜๋Š” ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ์ดํ›„์— ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜๋‚˜ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค.

โ—ผ ์ˆœ์ฐจ์  ์‹คํ–‰์„ ์œ„ํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋Œ€์‹  ์“ธ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋”ฉ ํŒจํ„ด์ด๋‹ค.

โ—ผ 3๊ฐ€์ง€ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•œ๋‹ค. (resolved(์„ฑ๊ณต), reject(์‹คํŒจ), pending(ํŒ์ • ๋Œ€๊ธฐ ์ค‘))

 

โœ” ์‚ฌ์šฉ๋ฒ•

let promise = new Promise(function (reslove, reject) {
  let result = 1 + 1;
  reslove(result); // promise๊ฐ€ ํ•จ์ˆ˜ ์‹คํ–‰์„ ์„ฑ๊ณต ์ฒ˜๋ฆฌํ•œ๋‹ค.
});

promise
  .then(function (data) {
    console.log(data); // 2
  })
  .catch(function () {
    console.log("error");
  });
let promise = new Promise(function (reslove, reject) {
  try {
    Exception();
    reslove();
  } catch (error) {
    reject(error); // promise๊ฐ€ ํ•จ์ˆ˜ ์‹คํ–‰์„ ์‹คํŒจ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  }
});

promise
  .then(function () {
    console.log("success");
  })
  .catch(function (err) {
    console.log(err); // error๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
  });

โ—ผ Promise๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์„ฑ๊ณต/์‹คํŒจ ํ–ˆ๋Š”์ง€ ํŒ์ •ํ•˜๋Š” ๊ธฐ๊ณ„์ด๋ฉฐ, ์ดํ›„ ์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ค€๋‹ค.

โ—ผ Promise Object๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, reslove์™€ reject ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์„ฑ๊ณต ์ฒ˜๋ฆฌ, ์‹คํŒจ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ reslove({๊ฒฐ๊ณผ ๊ฐ’}): ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์„ฑ๊ณต ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ธ์ž๋กœ ๋„ฃ์€ ๊ฒฐ๊ณผ ๊ฐ’์„ then({๋ณ€์ˆ˜})์—์„œ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ reject({Exception}): ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์˜ˆ์™ธ๋ฅผ ๋„˜๊ฒจ์„œ catch({๋ณ€์ˆ˜})์—์„œ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ then({function}): ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ์ดํ›„ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ catch({function}): ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ finally({function}): ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์„ฑ๊ณต์ ์ด๋“ , ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋“  ๋ฌด์กฐ๊ฑด ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ฌ  Promise๋Š” ์‹คํ–‰์˜ ๊ฒฐ๊ณผ(์„ฑ๊ณต, ์‹คํŒจ)์— ๋”ฐ๋ผ์„œ, then(), catch()๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ํ˜ธ์ถœ๋˜์–ด ์ดํ›„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.

๐Ÿ’ฌ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, js ํŒŒ์ผ์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„, Call Stack์— ๋“ฑ๋ก๋˜์–ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

๐Ÿ’ฌ fetch() ํ•จ์ˆ˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, then(), catch()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ” ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์ฒดํฌํ•˜๋Š” Promise ๋งŒ๋“ค๊ธฐ

<img id="test" src="js.png" />

<script>
  // Promise ๊ฐ์ฒด ์ƒ์„ฑ
  let imgLoadingCheck = new Promise(function (reslove, reject) {
    let img = document.querySelector("#test");
    // ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์„ฑ๊ณต
    img.addEventListener("load", function () {
      reslove();
    });
    // ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์‹คํŒจ
    img.addEventListener("error", function () {
      reject();
    });
  });

  imgLoadingCheck
    .then(function () {
      console.log("์„ฑ๊ณต"); // ์ถœ๋ ฅ
    })
    .catch(function () {
      console.log("์‹คํŒจ");
    });
</script>

โ—ผ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์„ฑ๊ณต/์‹คํŒจ Promise ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‘๋ฉด, imgLoadingCheckPromise๋ฅผ ์‚ฌ์šฉํ•ด์„œ then(), catch()๋กœ ์„ฑ๊ณต/์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“’ async/await

โœ” async

async function add() {
  console.log("1111");
  1 + 1;
}

add().then(() => {
  console.log("add Finish");
});

console.log("2222");

โ—ผ async ํ•จ์ˆ˜ ์•ž์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ๋กœ, ํ•ด๋‹น ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ function์€ Promise ์—ญํ• ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

โ—ผ async ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„, Promise ์˜ค๋ธŒ์ ํŠธ๊ฐ€ return ๋œ๋‹ค.

โ—ผ ์‹คํ–‰ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” return Promise.reject({๋‚ด์šฉ})์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

โ—ผ ์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” 1111 ์ถœ๋ ฅ, 2222 ์ถœ๋ ฅ, "add Finish"๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

๐Ÿ’ฅ Promise ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, add ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” JavaScript ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ , ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ ํ›„, Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, then()์— ๋“ฑ๋กํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ณด๋‹ค, ๋‹ค๋ฅธ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , Call Stack์ด ๋น„์—ˆ์„ ๋•Œ, then()์— ๋“ฑ๋กํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

โœ” await

async function add() {
  let promise = new Promise((resolve, reject) => {
    console.log("1๋ฒˆ");
    let result = 0;
    for (let i = 0; i < 10; i++) {
      result += i;
    }
    console.log(result);
    resolve(result);
  });

  console.log("2๋ฒˆ");

  try {
    let result = await promise;
    console.log("3๋ฒˆ");
    console.log(`๊ฒฐ๊ณผ: ${result}`);
  } catch (err) {}

  console.log("4๋ฒˆ");
}

console.log("์‹œ์ž‘");

add().then(() => {
  console.log("add Finish");
});

console.log("๋งจ์•„๋ž˜!");

โ—ผ async function ์•ˆ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

โ—ผ await์€ Promise ๊ฐ์ฒด ์ธ์Šคํ„ฐ์Šค ์•ž์— ์‚ฌ์šฉํ•ด์„œ ์„ฑ๊ณต/์‹คํŒจ ๊ฐ’์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ผ async function ์•ˆ์—์„œ Promise ๊ฐ์ฒด์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ๋•Œ ๊นŒ์ง€, ๋Œ€๊ธฐํ•ด์„œ async ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.

โ—ผ ์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” "์‹œ์ž‘" -> "1๋ฒˆ" -> 45 -> "2๋ฒˆ" -> "๋งจ์•„๋ž˜!" -> "3๋ฒˆ" -> "๊ฒฐ๊ณผ: 45" -> "4๋ฒˆ" -> "add Finish" ์ˆœ์„œ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

 

๐Ÿ’ฅ await์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

async function add() {
  let promise = new Promise((resolve, reject) => {
    console.log("1๋ฒˆ");
    let result = 0;
    for (let i = 0; i < 10; i++) {
      result += i;
    }
    console.log(result);
    resolve(result);
  });

  console.log("2๋ฒˆ");

  promise.then((res) => {
    console.log(`๊ฒฐ๊ณผ: ${res}`);
  });

  console.log("3๋ฒˆ");
}

add().then(() => {
  console.log("add Finish");
});

console.log("๋งจ์•„๋ž˜!");

โ—ผ ์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” "1๋ฒˆ" -> 45 -> "2๋ฒˆ" -> "3๋ฒˆ" -> "๋งจ์•„๋ž˜!" -> "๊ฒฐ๊ณผ: 45" -> "add Finish" ์ˆœ์„œ์ด๋‹ค.

โ—ผ await์„ ์‚ฌ์šฉํ•ด์„œ Promise ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ›์„ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ์ฝ”๋“œ ๋งจ ์•„๋ž˜๊นŒ์ง€ ์‹คํ–‰ํ•œ ๋’ค, Task Queue ์ˆœ์„œ์— ์˜ํ•ด promise.then()์— ๋“ฑ๋กํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ๋‹ค์Œ์œผ๋กœ add().then()์— ๋“ฑ๋กํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

'Web > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] this ํ‚ค์›Œ๋“œ ์•Œ์•„๋ณด๊ธฐ  (0) 2023.04.24
JavaScript ๊ธฐ๋ณธ ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ  (0) 2023.04.23