πŸͺ΄ μ„±μž₯일지

μ±… ν–‰λ³΅ν•œ 이기주의자(웨인 닀이어)의 λ‚΄μš©μ— μžκ·Ήλ°›μ•„ μ‹œμž‘ν•˜λŠ” μ†Œλ°•ν•œ μ„±μž₯기둝

μ‚΄μ•„μžˆλŠ” 꽃과 죽은 꽃은 μ–΄λ–»κ²Œ κ΅¬λ³„ν•˜λŠ”κ°€?
μ„±μž₯ν•˜κ³  μžˆλŠ” 것이 μ‚΄μ•„ μžˆλŠ” 것이닀.
생λͺ…μ˜ μœ μΌν•œ μ¦κ±°λŠ” μ„±μž₯이닀!

🌳 ν‚€μ›Œλ“œ μ΅œλŒ€ν•œ κ°„λ‹¨ν•˜κ²Œ 정리, 좔후에 λ³΄λ©΄μ„œ 슀슀둜 μ„€λͺ…

JavaScript 객체 λ¦¬ν„°λŸ΄

κ°μ²΄λž€ 뭘까

ν•˜λ‚˜μ˜ κ°’λ§Œ λ‚˜νƒ€λ‚΄λŠ” μ›μ‹œ νƒ€μž…κ³Ό λ‹€λ₯΄κ²Œ κ°μ²΄λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ 합쳐놓은 볡합적인 μžλ£Œκ΅¬μ‘°μ΄λ‹€.
λ˜ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체이기에 κ°’μœΌλ‘œ μ·¨κΈ‰ν•  수 μžˆλ‹€.

일급 κ°μ²΄λž€?

  • λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλ‹€.
  • λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 인자둜 전달받을 수 μžˆλ‹€.
  • λ‹€λ₯Έ ν•¨μˆ˜μ˜ 결과둜 리턴될 수 μžˆλ‹€.

κ°μ²΄λŠ” 크게 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ‘œ κ΅¬μ„±λœλ‹€.
쑰금 λ‹¨μˆœν•˜κ²Œ μƒκ°ν•˜λ©΄ ν”„λ‘œνΌν‹°λŠ” μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 값을 λ‚˜νƒ€λ‚΄κ³  λ©”μ„œλ“œλŠ” κ·Έ 값을 μ°Έμ‘°ν•˜κ³  μ‘°μž‘ κ°€λŠ₯ν•œ λ™μž‘μ΄λΌκ³  생각할 수 μžˆλ‹€.

μ•„λž˜ μ˜ˆμ‹œμ²˜λŸΌ, μžλ™μ°¨λΌλŠ” 객체λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ κ·Έ μ•ˆμ—λŠ” μžλ™μ°¨κ°€ 움직인 distance(ν”„λ‘œνΌν‹°)κ°€ 있고 κ·Έ 거리λ₯Ό μ¦κ°€μ‹œν‚€λŠ” ν•¨μˆ˜μΈ move(λ©”μ„œλ“œ)κ°€ μžˆλ‹€.
μ•½κ°„ μ–΄λ–€ νŠΉμ • κ°’κ³Ό κΈ°λŠ₯을 가진 λ‘œλ΄‡μ„ λ§Œλ“œλŠ” κΈ°λΆ„..? 이라 μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€.

var car = {
  distance: 0,
  move: function () {
    this.distance++;
  },
};

이처럼 객체λ₯Ό 톡해 μƒνƒœμ™€ λ™μž‘μ„ ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ ꡬ쑰화할 수 μžˆμ–΄ μœ μš©ν•˜λ©°, μ΄λ ‡κ²Œ 객체의 μ§‘ν•©μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ ν‘œν˜„ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λΌκ³  ν•œλ‹€.

객체 λ¦¬ν„°λŸ΄μ€ 뭐지?

일반적으둜 C++μ΄λ‚˜ μžλ°”κ°™μ€ 클래슀 기반 객체지ν–₯ μ–Έμ–΄λŠ” 객체λ₯Ό 생성할 λ•Œ, 미리 클래슀λ₯Ό λ§Œλ“€κ³  new μ—°μ‚°μžλ₯Ό ν†΅ν•΄μ„œ 객체λ₯Ό μƒμ„±ν•œλ‹€.
그런데 이게 웬걸, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ ν‘œν˜„λ²•(λ¦¬ν„°λŸ΄)을 μ•½μ†ν•¨μœΌλ‘œμ¨ μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ 객체λ₯Ό 생성할 수 μžˆλ‹€.

  • 객체 λ¦¬ν„°λŸ΄
  • Object μƒμ„±μž ν•¨μˆ˜
  • μƒμ„±μž ν•¨μˆ˜
  • Object.create λ©”μ„œλ“œ
  • 클래슀(ES6에 좔가됨)

μœ„μ˜ 방법 쀑 객체 λ¦¬ν„°λŸ΄μ€ {}둜 객체λ₯Ό λ°”λ‘œ 생성할 수 μžˆλŠ” 방법이닀. λ”°λ‘œ 클래슀λ₯Ό μƒμ„±ν•˜κ³  new μ—°μ‚°μž 없이도 λ°”λ‘œ λΏ… ν•˜κ³  객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

property/method, key/value

μœ„ μš©μ–΄ 4가지λ₯Ό ν™•μ‹€νžˆ 짚고 λ„˜μ–΄κ°€μž.

var obj = {
  name: 'jayden', // 이 μƒνƒœκ°’μ„ λ‚˜νƒ€λ‚΄λŠ” ν•œ 쀄 μžμ²΄κ°€ property
  do: function () {
    console.log('Hello World!');
  }, // μ΄λ ‡κ²Œ λ™μž‘μ„ λ‚˜νƒ€λ‚΄λŠ”(valueκ°€ ν•¨μˆ˜) 게 method
};
// μœ„μ—μ„œ nameκ³Ό doλŠ” key, 'jayden'κ³Ό function() ~ λŠ” value에 ν•΄λ‹Ήν•œλ‹€.

JavaScript λ‹€μ–‘ν•œ ν•¨μˆ˜λ“€

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ‘œ 단 ν•œ 번만 호좜되며 λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λ‹€.

(function test() {
  console.log('μ¦‰μ‹œ μ‹€ν–‰');
})();

// test() 해도 μ‹€ν–‰ μ•ˆλ¨. μ—λŸ¬ λ‚œλ‹€. (() λ‚΄μ˜ ν•¨μˆ˜ 선언문은 선언문이 μ•„λ‹Œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ ν‰κ°€λ˜κΈ° λ•Œλ¬Έ)

// μœ„μ™€ ()의 μœ„μΉ˜λ§Œ λ°”λ€Œκ³  μ΄λ ‡κ²Œ 쓰기도 ν•œλ‹€.
(function test() {
  console.log('μ¦‰μ‹œ μ‹€ν–‰');
})();

μž¬κ·€ ν•¨μˆ˜

ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ 호좜이라고 ν•˜κ³ , 이런 μž¬κ·€ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό μž¬κ·€ ν•¨μˆ˜λΌκ³  ν•œλ‹€.
μž¬κ·€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 반볡문 없이 같은 κ²°κ³Όλ₯Ό λ‚Ό 수 μžˆλ‹€. λ˜ν•œ, μž¬κ·€ ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ μž¬κ·€λ₯Ό 멈좜 νƒˆμΆœ 쑰건이 μžˆμ–΄μ•Όν•œλ‹€.

// μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ κ΅¬ν˜„ν•œ νŒ©ν† λ¦¬μ–Ό
var factorial = function (n) {
  if (n <= 1) {
    return 1; // 이게 λ¬΄ν•œ μž¬κ·€λ₯Ό 멈좜 νƒˆμΆœ 쑰건(μ—†μœΌλ©΄ 계속 μž¬κ·€μž¬κ·€μž¬κ·€μž¬κ·€μž¬κ·€μž¬κ·€μž¬κ·€μž¬...)
  }
  return n * factorial(n - 1);
};

μž¬κ·€ ν•¨μˆ˜λŠ” λ°˜λ³΅λ˜λŠ” 처리λ₯Ό 반볡문 없이 μ“Έ 수 μžˆλ‹€λŠ” μž₯점이 μžˆμœΌλ‚˜!!! λ¬΄ν•œ λ°˜λ³΅μ— 빠질 수 있기 λ•Œλ¬Έμ— νŠΉλ³„νžˆ μž¬κ·€ ν•¨μˆ˜κ°€ 더 직관적이고 νŽΈμ•ˆν•œ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ ν•œμ •μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 게 λ‚«λ‹€.

μž¬κ·€ ν•¨μˆ˜κ°€ λ¬΄ν•œ λ°˜λ³΅λ˜μ–΄μ„œ ν•¨μˆ˜λ§ˆλ‹€μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ½œμŠ€νƒμ— μŒ“μ΄λ©΄ 그게 λ°”λ‘œ 유λͺ…ν•œ μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°

쀑첩 ν•¨μˆ˜(λ‚΄λΆ€ ν•¨μˆ˜)

ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜

var outer = function () {
  var inner = function () {
    console.log('λ‚΄λΆ€ ν•¨μˆ˜μž…λ‹ˆλ‹Ή.');
  };
  inner();
};
outer();

μœ„μ™€ 같은 식인데, λ‚΄λΆ€ ν•¨μˆ˜(쀑첩 ν•¨μˆ˜) λ°”κΉ₯은 μ™ΈλΆ€ ν•¨μˆ˜λΌκ³  λΆ€λ₯΄λ©° β€˜μ΄κ²Œ 뭐 λ³΅μž‘ν•œ 게 μžˆλ‚˜?’ 싢을 수 μžˆμ§€λ§Œ
이 λ‚΄λΆ€/μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜ μ°Έμ‘° 및 λ‚΄λΆ€ ν•¨μˆ˜μ˜ μ™ΈλΆ€ 전달 등에 따라 ν΄λ‘œμ € ν˜„μƒμ΄ μΌμ–΄λ‚œλ‹€.

콜백 ν•¨μˆ˜

μ–΄λ–€ ν•¨μˆ˜(κ³ μ°¨ ν•¨μˆ˜)의 인자둜 μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ‘œ, κ³ μ°¨ ν•¨μˆ˜μ—κ²Œ κ·Έ μ œμ–΄κΆŒμ„ λ„˜κ²¨μ£ΌλŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.
비동기 μ²˜λ¦¬μ™€ λ°°μ—΄μ˜ κ³ μ°¨ ν•¨μˆ˜μ—μ„œ 맀우맀우 μ€‘μš”ν•œ κ°œλ…μ΄λ‹€.

// μ˜ˆμ‹œ1: 비동기 μ²˜λ¦¬μ—μ„œμ˜ 콜백 ν•¨μˆ˜ ν™œμš©
setTimeout(function () {
  console.log('비동기 처리~');
}, 3000);

// μ˜ˆμ‹œ2: λ°°μ—΄ κ³ μ°¨ ν•¨μˆ˜μ—μ„œμ˜ 콜백 ν•¨μˆ˜ ν™œμš©
[1, 2, 3].forEach((value, index) => console.log(value, index));

순수 ν•¨μˆ˜μ™€ λΉ„μˆœμˆ˜ ν•¨μˆ˜

  • 순수 ν•¨μˆ˜: μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ” 본인의 μΈμžλ§Œμ„ κ°–κ³  λ…ΈλŠ” ν•¨μˆ˜(λ™μΌν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값이 λ‚˜μ˜΄)
  • λΉ„μˆœμˆ˜ ν•¨μˆ˜: μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄λ„ ν•˜κ³ , μ™ΈλΆ€ μƒνƒœλ₯Ό λ©‹λŒ€λ‘œ 바꾸기도 ν•˜κ³  κΉ¨λž‘κΉŒλž‘ν•œ ν•¨μˆ˜
// 순수 ν•¨μˆ˜
var count = 0;

function pure(n) {
  return ++n
}

count = pure(count); // count에 1 ν• λ‹Ή
count = pure(count); // count에 2 ν• λ‹Ή
--------
// λΉ„μˆœμˆ˜ ν•¨μˆ˜
var count = 0;

function dirty() {
  return ++count;
}

dirty() // count에 1 할당됨
dirty() // count에 2 할당됨

λΉ„μˆœμˆ˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ ν•¨μˆ˜ λ‚΄μ˜ 값이 μ•„λ‹Œ μ™ΈλΆ€μ˜ 값이 λ³€κ²½λ˜λŠ” 것을 λΆ€μˆ˜ 효과라고 ν•œλ‹€.
λ¬Όλ‘  이와 같은 효과λ₯Ό ν™œμš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ, μ½”λ“œκ°€ κΈΈμ–΄μ§ˆμˆ˜λ‘ λΉ„μˆœμˆ˜ ν•¨μˆ˜μ˜ λΆ€μˆ˜ νš¨κ³ΌλŠ” 였λ₯˜λ₯Ό λ²”ν•  ν™•λ₯ μ„ λ†’μ΄λ―€λ‘œ μ΅œλŒ€ν•œ 순수 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ λ³Έμ—°μ˜ κ°’ μ™Έμ—λŠ” λ°”λ€Œμ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이 μ’‹λ‹€.