2024-03-04.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 1์ฃผ์ฐจ-1

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week1-1_2024-03-04

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------ | ----------- | | 1์ฃผ์ฐจ | 1, 2์žฅ | ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ์š”์†Œ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ | 26p์ค‘~59p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: 9์‹œ๋ฐ˜~12์‹œ ๋น ๋ฅด๊ฒŒ ์ฝ๊ธฐ~!

๊ฐ์ฒด

  • ๊ฐ์ฒด๋Š”? ์ฐธ์กฐ ํƒ€์ž…์ด๋‹ค~ reference type์ด๋‹ค~
  • ๊ฐ์ฒด๋Š”? ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค~ writable์ด๋‹ค~
  • ๊ฐ์ฒด๋Š”? ๋ณต์‚ฌํ•  ๋•Œ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค~ !==~

Object.is

  • [ES6(ES2015)] ์–˜๋„ ๊ฐ์ฒด ๋น„๊ต๋Š” !==
  • Object.is({},{}) // false

๋ฆฌ์•กํŠธ์˜ ๋™๋“ฑ ๋น„๊ต๋Š” Object.is๋‹ค?!?

  • objectIs: ES6 ํด๋ฆฌํ•„
function is(x: any, y: any) {
  return (
    (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y) // eslint-disable-line no-self-compare
  );
}

const objectIs: (x: any, y: any) => boolean =
  typeof Object.is === "function" ? Object.is : is;

export default objectIs;
  • shallowEqual: ๊ฐ์ฒด ๊ฐ„ ๋น„๊ต(Object.is + ๋ฐฐ์—ด ๊ธธ์ด + ํ‚ค ๋น„๊ต + ๊ฐ’ ๋น„๊ต)
    • Object.is์™€ ๋‹ฌ๋ฆฌ => React์˜ shallowEqual์€ ์ฐธ์กฐ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋„ 1 depth๊นŒ์ง€๋Š” ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค~
export default function shallowEqual(objA: mixed, objB: mixed): boolean {
  if (is(objA, objB)) return true;

  if (
    typeof objA !== "object" ||
    objA === null ||
    typeof objB !== "object" ||
    objB === null
  )
    return false;

  const keysA = Object.keys(objA); // ํ‚ค
  const keysB = Object.keys(objB);

  if (keysA.length !== keysB.length) return false; // ๋ฐฐ์—ด ๊ธธ์ด ๋น„๊ต

  for (let i = 0; i < keysA.length; i++) {
    const currentKey = keyA[i];
    if (
      !hasOwnProperty.call(objB, currentKey) ||
      !is(objA[currentKey], objB[currentKey])
    )
      return false;
  }

  return true;
}
  • JSX props๋Š” ๊ฐ์ฒด๋‹ค~ ์–•์€ ๋น„๊ต๋ฅผ ํ•œ๋‹ค~
    • ์ฆ‰, props์— ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค๋ฉด~? ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค~~
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง• => ๊ฐ์ฒด ๋น„๊ต์˜ ๋ถˆ์™„์ „์„ฑ, ์–•์€ ๋น„๊ต๋งŒ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

ํ•จ์ˆ˜

  • ํ•จ์ˆ˜๋ž€?
    • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋“ฑ์˜ ๊ณผ์ •์„ => ํ•˜๋‚˜์˜ ๋ธ”๋ก์œผ๋กœ ๊ฐ์‹ธ์„œ ์‹คํ–‰ ๋‹จ์œ„๋กœ ๋งŒ๋“  ๊ฒƒ
  1. ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€? ๋ฌธ statement์ด๋‹ค~ ๊ทธ๋Ÿฐ๋ฐ?? ์ฝ”๋“œ ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ํ‘œํ˜„์‹์œผ๋กœ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค~ (JS ์—”์ง„์€ ๋ชป ๋ง๋ ค~)
const sum = function sum(a, b) {
  return a + b;
};

sum(10, 24); // 34
  1. ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€? ๋ณ€์ˆ˜์— ํ• ๋‹น, ํ•จ์ˆ˜๋ช…์„ ์ฃผ๋กœ ์ƒ๋žต
  • ์ผ๊ธ‰ ๊ฐ์ฒด: ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜๊ฐ’, ํ• ๋‹น ๋‹ค ๊ฐ€๋Šฅ
  1. Function ์ƒ์„ฑ์ž๋Š”? ํ•จ์ˆ˜ ๋ชธํ†ต์ด ๋ฌธ์ž์—ด, ํด๋กœ์ € ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ
  2. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š”? ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ x, arguments ์—†์Œ
  • this๋ž€? ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋‚˜, ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ this๋Š”? ์ƒ์œ„ ์Šค์ฝ”ํ”„ this~ => ๋ณ„๋„์˜ ์ž‘์—… ์—†์ด ์ƒ์œ„ this์— ์ ‘๊ทผ

IIFE, Immediately Invoked Function Expression

  • ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๋Š” ๋…๋ฆฝ์ ์ธ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ์šด์šฉ
  • ์บก์Š~

Higher Order Function / Higher Order Component

  • ๊ณ ์ฐจ ํ•จ์ˆ˜~ ์ผ๊ธ‰ ๊ฐ์ฒด~ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ~

์ˆœ์ˆ˜ ํ•จ์ˆ˜ Pure Component

  • ๋ถ€์ˆ˜ ํšจ๊ณผ side-effect ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜
  • useEffect๋ฅผ ์ค„์ด์ž ์ง„์งœ๋กœ

ํ•จ์ˆ˜๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ

  • max-lines-per-function, 50์ค„~
  • Malcolm Douglas McIlroy => Do One Thing and Do It Well. ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ผ์„, ๊ทธ ํ•˜๋‚˜๋งŒ ์ž˜ ํ•˜๋ฉด ๋œ๋‹ค.

ํด๋ž˜์Šค

  • React 16.8 ์ด์ „์—๋Š”? ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ
  • [ES2019] #์œผ๋กœ private
  • Typescript: private, protected, public
  • ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ == ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ
const myCar = new Car("์ฐจ์ฐจ์ฐจ");

Object.getPrototypeOf(myCar) === Car.prototype; // true
myCar.__proto__ === Car.prototype; // true
  • ๐Ÿ“Œ __proto__๋ฅผ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค => ์™œ๋ƒ? typeof null === 'object' ์ฒ˜๋Ÿผ, ์˜๋„๋œ ํ‘œ์ค€์€ ์•„๋‹ˆ์ง€๋งŒ ๊ณผ๊ฑฐ ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜ธํ™˜์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ž„
  • => Object.getPrototypeOf๋ฅผ ์“ฐ์ž
  • prototype chaining ์˜ˆ์‹œ => Object์˜ toString()

ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜

  • ES6 ์ด์ „์—๋Š” ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ํด๋ž˜์Šค ์ž‘๋™ ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ–ˆ์Œ
  • ๋ฐ”๋ฒจ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง: _createClass ๋ผ๋Š” ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด => ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•จ
    • prototype ๊ธฐ๋ฐ˜, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์œ ์‚ฌํ•˜๊ฒŒ ์žฌํ˜„ / ํด๋ž˜์Šค๋Š” syntactic sugar

์˜์–ด
Strict Equality Operator, ๋™๋“ฑ ์—ฐ์‚ฐ์ž / Equality Operator, ์ผ์น˜ ์—ฐ์‚ฐ์ž