[ํด๋ผ์ฐ๋ฉ ์ดํ๋ฆฌ์ผ์ด์ ์์ง๋์ด๋ง TIL] 240109 - JS ๊ฐ์ฒด, ๋นํธ์ธ ๊ฐ์ฒด
Intro
์ค๋์ ์ธํ์ด ๋๋ฌด ๋๋ฌด ๋ง์ ๋ ์ด์๋ค.
๊ฐ์๋ ์์ฒญ ๋ง๊ณ .. ํ๋กํ ํ์ ์ด๋ ์ค์ฝํ, ์คํ ์ปจํ ์คํธ ๋ฑ๋ฑ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฒญ ์ค์ํ ํน์ง๋ค์ ๋ค ๋ฐฐ์ ๋ค. ํ๋ฃจ๋ง์...
๊ฑฐ๊ธฐ๋ค๊ฐ Github A to Z ํน๊ฐ๊น์ง ๋ค์ด์ ์กฐ๊ธ ๋นก์ ๋ค. ใ ใ

์ค๋ ํ์ตํ ๋ด์ฉ
: ๋ฐ์ดํฐ ์ฒ๋ฆฌ > ๊ฐ์ฒด์ ๋นํธ์ธ ๊ฐ์ฒด ๊ทธ๋ฆฌ๊ณ ๋งค์ปค๋์ฆ
๊ฐ์ฒด
ํ๋กํ ํ์ ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ์ธ์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด๋ ๋งค์ฐ ์ค์ํ๋ค.
๊ฐ์ฒด๋, ์์ฑ์ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ๊ฐ์ฒด (์์ฑ์ผ๋ก ๊ตฌ์ฑ๋ ์งํฉ)์ด๋ค.
โ ๏ธ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
๊ฐ์ฒด๋ผ๋ ๊ธฐ๋ณธ ๋จ์๋ก ๋๋๊ณ ์ด๋ค์ ์ํธ์์ฉ์ผ๋ก ์์ ํ๋ ๋ฐฉ์
์ค์ธ๊ณ์ ์กด์ฌํ๊ณ ์ธ์งํ๊ณ ์๋ ๊ฐ์ฒด(Object)๋ฅผ ์ํํธ์จ์ด์ ์ธ๊ณ์์ ํํํ๊ธฐ ์ํด ๊ฐ์ฒด์ ํต์ฌ์ ์ธ ๊ฐ๋ ๋๋ ๊ธฐ๋ฅ๋ง์ ์ถ์ถํ๋ ์ถ์ํ(abstraction)๋ฅผ ํตํด ๋ชจ๋ธ๋งํ๋ ค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ - poiemaweb
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์๋ ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด๊ฐ ์๋๋ฐ ๋ํ์ ์ธ ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด๋ Java, C++ ๋ฑ์ด ์๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์ ์ํ๋ค.
๊ฐ์ฒด ์์ฑ
: ํค์ ๊ฐ ์ฌ์ด์ ์ฐ๊ฒฐ๊ด๊ณ (key-value)
- ์์ฑ ์ ๊ทผ ๋ฐฉ๋ฒ
- objectName.prototypeName
- objectName["prototypeName"]
โ๏ธ์์ฑ์๋ ๊ฐ ๋ฟ๋ง ์๋๋ผ ํจ์๋ ํ ๋น ๊ฐ๋ฅ
๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ
- ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ
const foo = { name: 'apple' }
- ์์ฑ์ ํจ์
- ์์ฑ๋ง ๊ฐ๊ณ ๊ฐ์ด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํ ๋
- ์์ฑ์ ํจ์๋ฅผ ์ ์ํ ํ, ์์ฑ์ ํจ์๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
function Person(name, age) {
this.name = name
this.age = age
}
new Person('gayeon', 29)
- Object.create
- ์์ฑ์ ํจ์์ฒ๋ผ ๋์ผํ ์์ฑ๊ฐ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
๊ฐ์ฒด ์์ฑ ์ปจํธ๋กค
๊ฐ์ฒด๋ ์ฐธ์กฐ ํํ๋ก ์ ๋ฌ๋๋ฉฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ด๋ค.
โก๏ธ ์ด๋ ๊ฐ์ฒด ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ค๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๋ฌธ์ ์ ์ ์ผ๊ธฐํ๋ค. (์ฐธ์กฐ ํํ๋ก ๊ฐ์ ์ฃผ์๊ฐ์ ๋ฐ๋ผ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ) ๋๋ฌธ์ ์๋ํ ๋์์ด ๋๊ธฐ ์ํด ์ ์ ํ ์กฐ์์ด ํ์ํ๋ค.
- ๋์ ์์ฑ
- ๊ฐ์ฒด์ ์กด์ฌํ์ง ์๋ ์์ฑ์ ์ฐธ์กฐํ๊ณ ํ ๋น๋ฌธ์ ํตํด ๊ฐ์ ํ ๋นํ๋ฉด ์์ฑ์ด ๋์ ์ผ๋ก ์์ฑ๋๊ณ ์ถ๊ฐ๋จ
const person = {
name: 'gayeon',
age: 25,
}
person.gendor = 'w'; // ๋์ ์์ฑ
- ๊ฐ์ฒด ์์ฑ ๋์ด
- for...in
- Object.keys(๊ฐ์ฒด)
- Object.getOwnPropertyNames(๊ฐ์ฒด)
function Person(name, age) {
this.name = name
this.age = age
}
const gayeon = new Person('gayeon', 29)
for(key in gayeon) {
console.log(key)
} /*
name
age
*/
Object.keys(gayeon) // ['name', 'age']
Object.getOwnPropertyNames // ['name', 'age']
- ๊ฐ์ฒด ์์ฑ ์ญ์ (delete ํค์๋)
function Person(name, age) {
this.name = name
this.age = age
}
const gayeon = new Person('gayeon', 29)
delete gayeon.name // true
console.log(gayeon) // Person { age: 29 }
๊ฐ์ฒด ๋น๊ต์ ๋ณต์ฌ
๊ฐ์ฒด ๋น๊ต
: ๊ฐ์ฒด๋ฅผ ์๋ก ๋น๊ตํ๋ฉด ์์ฑ๊ณผ ๊ฐ์ด ๊ฐ์๋ ์ฐธ์กฐ๊ฐ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ false๊ฐ ๋์จ๋ค.
๋์ผํ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ ๋ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๋ณ์์ ๊ทธ๋๋ก ํ ๋นํ ๊ฒฝ์ฐ, ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ํ ๋น๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค๋ฅธ ๋ณ์์ ๊ฐ๋ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ๋ณต์ฌ๋ฅผ ํตํด ๊ตฌํํด์ผ ํ๋ค.
const obj = { a: 'a', b: 'b', c: 3 }
const obj2 = { a: 'a', b: 'b', c: 3 }
const obj3 = obj
obj === obj2 // false
obj === obj3 // true
obj.a = 'aaa'
console.log(obj3) // {a: 'aaa', b: 'b', c: 3}
๊ฐ์ฒด ๋ณต์ฌ์ 2๊ฐ์ง ๋ฐฉ๋ฒ
- ์์ ๋ณต์ฌ
- ๊ฐ์ฒด ์์ฑ ์ค ์ฐธ์กฐ ํ์ ์ด ์๋ ๊ฒฝ์ฐ ์์ ๋ณต์ฌ ๋ฐฉ๋ฒ ๊ถ์ฅ
- Object.assign({}, ๋ณต์ฌํ ๊ฐ์ฒด)
- spread ์ฐ์ฐ์ { ...๋ณต์ฌ ๊ฐ์ฒด }
const obj = { a: 'a', b: 'b', c: 3 }
const obj2 = Object.assign({}, obj)
const obj3 = { ...obj }
obj2 // { a: 'a', b: 'b', c: 3 }
obj3 // { a: 'a', b: 'b', c: 3 }
obj === obj2 // false
obj === obj3 // false
- ๊น์ ๋ณต์ฌ
- ๋ณต์ฌ๋ ๊ฐ์ฒด ์์ฑ ์ค ํ๋๋ผ๋ ์ฐธ์กฐ๋ฅผ ํ๊ณ ์๋ ์์ฑ์ด ์๋ค๋ฉด ๊น์ ๋ณต์ฌ๋ก ๋ณต์ฌ๋์๋ค๊ณ ํ๋ค.
- ๊น์ ๋ณต์ฌ ๋ฐฉ๋ฒ
- ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ ๋ณต์ฌ (์ถ์ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: lodash - cloneDeep)
- JSON.stringify: ๊ฐ์ฒด -> ๋ฌธ์์ด๋ก ๋ณํ -> ๊ฐ์ฒด๋ก ๋ณํ (JSON.parse) ๊ถ์ฅํ์ง ์๋ ๋ฐฉ์
๊ฐ์ฒด ์ข ๋ฅ
- ํ์ค ๋นํธ์ธ ๊ฐ์ฒด ECMAScript
- ํธ์คํธ ๊ฐ์ฒด (๋ธ๋ผ์ฐ์ ๊ธฐ์ค) DOM API
ํ์ค ๋นํธ์ธ ๊ฐ์ฒด ECMAScript
๊ธฐ๋ณธ์ ์ผ๋ก Object ๊ฐ์ฒด ์์ฑ์ ์์ ๋ฐ๋๋ค. โก๏ธ ํ๋กํ ํ์ ๋ฉ์๋๋ค์ ๋ชจ๋ ์์ (toString(), toLocaleString(), valueOf()..)
- ๊ธฐ์ด ๊ฐ์ฒด: Object, Function, Boolean, Symbol
- ์ค๋ฅ ๊ฐ์ฒด: Error
- ์ซ์ ๋ฐ ๋ ์ง: Number, BigInt, Math, Date
- ํ ์คํธ ์ฒ๋ฆฌ: Regex, String
- Collection: Array, Map, Set ...
- ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ: JSON
- ์ ์ด ์ถ์ํ ๊ฐ์ฒด (Promise, Generator, AsyncFunction, ...)
Date์ UTC
Date๊ฐ์ฒด๋ 1970๋ 1์ 1์ผ UTC ์์ ๊ณผ์ ์๊ฐ ์ฐจ์ด๋ฅผ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋ํ๋ธ ๊ฒ์ด๋ค.
โ UTC
- Universal Time Coordinated ๊ตญ์ ํ์ค ์๊ฐ์ ํ์ ์ธ๊ณ์
- ๊ตญ์ ์ ์ธ ํ์ค ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฐ์ด๋ ์๊ฐ
- ์ธํฐ๋ท, WWW, ํญ๊ณต ๋ฑ์์ ์ฌ์ฉ๋๋ค.
- ํ๊ตญ์ UTC๊ธฐ์ค์ผ๋ก +9์๊ฐ
โ ๋ ์ง ํ๊ธฐ์ ISO 8601
- ISO ๊ตญ์ ํ์คํ ๊ธฐ๊ตฌ์์ ๋ ์ง๋ฅผ ํํํ๋ ๋ฐฉ์์ ํ์กดํ ํ์๋ค.
- ISO 8601
- YYYY-MM-SSTHH:mm:ssZ (๋ง์ด ์ฌ์ฉ)
- ํผํฉ๋ ์ผ์ ํํ ์ T ๊ตฌ๋ถ์ ์ฌ์ฉ
- UTC ๋ ์ง๋ผ๋ ์๋ฏธ๋ก Z ํํ
์ ๊ท ํํ์
: ๋ฌธ์์ด์์ ํน์ ๋ฌธ์ ์กฐํฉ์ ์ฐพ๊ธฐ ์ํ ํจํด
/pattern/flags (ex. /\w+\s/g)
์ ๊ท ํํ์ ์์ฑ ๋ฐฉ๋ฒ
- ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ: ์ ๊ท์์ด ๋ณํ์ง ์๋๋ค๋ฉด ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ฌ์ฉ
- RegExp ๊ฐ์ฒด
- ๋ฐํ์ ๋ ์ปดํ์ผ ๋๋ฉฐ ํจํด์ด ๋ณํ ๊ฐ๋ฅ์ฑ์ด ์๊ฑฐ๋ ์์ ์๋ ๋ฐ์ดํฐ์์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํจ
- new RegExp(/pattern/, flag)
โ ์ ๊ทํํ์ ํ๋๊ทธ(flag) ์ข ๋ฅ
- d: dotAll
- g: global
- i: ignore case
- m: multiline
- s: souce
- y: sticky
- u: unicode
Collection
: ๋ฐ์ดํฐ ํญ๋ชฉ๋ค์ ๊ทธ๋ฃน์ ์๋ฏธ (list, set, tree, graph ๋ฑ์ด ํฌํจ๋์ด ์๋ค.)
โ ์๋ฐ์คํฌ๋ฆฝํธ์ Collection
- Indexed Collections
- Index ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ๋ฐ์ดํฐ ์งํฉ โก๏ธ Array, TypedArray
- Keyed Collections
- Key ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ด ์๋ ๋ฐ์ดํฐ ์งํฉ โก๏ธ Map, Set
- ํค์ ๊ฐ์ ๋งคํํ์ฌ ์ ์ฅ
- ์ ์ฅ๋ ์์๋๋ก ๊ฐ ์์๋ค์ ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
Indexed Collections - Array
- 1๊ฐ์ ๋ณ์์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์์ฐจ์ ์ผ๋ก ์ ์ฅํ ๋ ์ฌ์ฉ
- 0๊ฐ ์ด์์ ์ ๋ชฉ๋ก
- ๊ธธ์ด๋ ๊ณ ์ ๋์ด ์์ง ์๊ณ ๋ชจ๋ ์์๋ ํ์๊ฐ์ด ์๋๋ค. (undefined ์ฌ์ฉ ๊ฐ๋ฅ)
- ๋ฐฐ์ด ์์ฑ ๋ฐฉ๋ฒ
- []
- new Array(arrayLength)
- new Array(element0, element1, ...)
- index๋ก ์ฐธ์กฐํ๋ฉฐ 0๋ถํฐ ์์ํ๋ค. (๋ฐฐ์ด์ ๊ธธ์ด = ๋ฐฐ์ด์ ๋ง์ง๋ง index + 1)
- index ๊ฐ์ ์์ฑ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํด ํ์ค ๊ฐ์ฒด์ ์์ฑ์ฒ๋ผ ์ ์ฅํ๋ค.
- for, forEach๋ก ๋ฐฐ์ด ๋ฐ๋ณต
Key based Collections - Map, WeakMap, Set, WeakSet
Map, WeakMap
: ํค์ ๊ฐ์ ๋งคํ์์ผ ์ ์ฅํ๋ฉฐ key๋ unique
- Map: ๊ฐ๋จํ ํค์ ๊ฐ์ ์๋ก ๋งคํ์์ผ ์ ์ฅํ๊ณ ์ ์ฅ๋ ์์๋๋ก ์์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
- WeakMap: ํค์ ๋ํ ๊ฐ๋ ฅํ ์ฐธ์กฐ๋ฅผ ์์ฑํ์ง ์๋ ํค/๊ฐ ์์ ๋ชจ์์ผ๋ก ํค๋ object๋ง ํ์ฉํ๋ค. ๊ฐ์ฒด ์ ๋ณด๋ฅผ ๋น๋ ธ์ถํ๋ ํน์ง์ด ์์ด ๊ฐ์ฒด์ ์ฌ์ ์ธ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์์ธ ๊ตฌํ๋ด์ฉ์ ์จ๊ธฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
โ Map VS Object
Object | Map | |
์์ฑ์ ๋ฐ์ดํฐ ํ์ | ํค๋ก string, Symbol ํ์ ๋ง ๊ฐ๋ฅ | ๋ชจ๋ ๊ฐ์ ํค๋ก ํ์ฉ |
default ์์ฑ๊ณผ์ ์ถฉ๋ | Object prototype์ ๊ธฐ๋ณธ ์์ฑ๊ณผ ๋์ผํ ํค ์์ฑ ์ ์ถฉ๋ | ๊ธฐ๋ณธ ์์ฑ์ด ์์ด ์ถฉ๋ X |
๊ฐ์ฒด ํฌ๊ธฐ | ์๋ ์ถ์ | size ์ธ์คํด์ค ์์ฑ์ผ๋ก ํ์ธ ๊ฐ๋ฅ |
์์ ๋ณด์ฅ | X | O |
iterable | X | O (foreach ์ ์ด๋ฌธ ์ฌ์ฉ ๊ฐ๋ฅ) |
ํผํฌ๋จผ์ค | ๋ ์ข์ | ์ข์ |
์ง๋ ฌํ ๊ตฌ๋ฌธ๋ถ์ ์ ๊ณต | O | X |
Set, WeakSet
: ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ ์ ์์ผ๋ฉฐ ์ค๋ณต๋ ๊ฐ์ ํ์ฉํ์ง ์๋๋ค.
- Set
- ๋ชจ๋ ๊ฐ๋ค์ ์งํฉ
- ์ ๋ ฅ๋ ์์์ ๋ฐ๋ผ ์ ์ฅ๋ ์์๋ฅผ ๋ฐ๋ณต ์ฒ๋ฆฌ
- NaN์ Set์์ ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํจ
- ๋ฐฐ์ด -> Set, Set -> ๋ฐฐ์ด๋ก ๋ณํ ๊ฐ๋ฅํ๋ฉฐ, for...of๋ฅผ ํตํด ์ํ ๊ฐ๋ฅํ๋ค.
- WeakSet
- ๊ฐ์ฒด ์ปฌ๋ ์ (object ๊ฐ๋ง์ ํ์ฉ)
- ์ฝํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง
const foo = new WeakSet()
foo.add({ foo: 1 })
โ Set VS Array
Array | Set | |
ํฌํจ ์ฌ๋ถ ํ์ธ ํผํฌ๋จผ์ค | indexOf (ํผํฌ๋จผ์ค ๋๋ฆผ) | has ๋ฉ์๋ |
์์ ์ ๊ฑฐ | ์์ ์ ๊ฑฐํ๋ฉด ๋ฐฐ์ด์ ์๋ผ๋ด์ผ ํจ | delete ๋ฉ์๋ |
์์ ์ฐพ๊ธฐ | NaN์ indexOf ํฌํจ์ฌ๋ถ๋ฅผ ํ์ธ ๋ถ๊ฐํจ | Set์ ํ์ธ ๊ฐ๋ฅ |
์ค๋ณต ์ฌ๋ถ ํ์ธ | ์ํํ๋ฉฐ ํ์ธํด์ผ ํ๋ค. | ์ค๋ณต ๋ถ๊ฐ๊ฐ ๊ธฐ๋ณธ |
JSON (JavaScript Object Notation) ๊ฐ์ฒด
: ์ธํฐ๋ท์์ ์๋ฃ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์๋ฃ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์๋ ค์ ธ ์์
- ํค-๊ฐ ์, ๋ฐฐ์ด ์๋ฃํ, ํคํ ๋ชจ๋ ์ง๋ ฌํ ๊ฐ๋ฅํ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ open standard ํฌ๋งท
- ํ์ฅ์: .json
- ๊ฐ์ฒด ํํ์ ์ ์ฌํ๋ค.
- ์์ฑ์ ํจ์๊ฐ ์๋๋ฉฐ, ํจ์๋ก์ ์ฌ์ฉ ๋ถ๊ฐํ๋ค.
โ ๏ธ ๋ฌธ์์ด์ด ๊ฐ์ฒด ํํ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ค๋ฅ ๋ฐ์ -> try...catch๋ฌธ์ผ๋ก ์๋ฌ ํธ๋ค๋ง ๊ถ์ฅ โ ๏ธ
๐ ์ง๋ ฌํ (serialization), ์ญ์ง๋ ฌํ (deserialization)
- ์ง๋ ฌํ: Object โก๏ธ ๋ฌธ์์ด (JSON.stringify)
- ์ญ์ง๋ ฌํ: ๋ฌธ์์ด โก๏ธ Object (JSON.parse)
๊ตญ์ ํ (intl ๊ฐ์ฒด)
: ๊ฐ ์ธ์ด์ ๋ง๋ ๋ฌธ์, ์ซ์, ์๊ฐ, ๋ ์ง ๋น๊ต๋ฅผ ์ ๊ณตํ๋ ๊ตญ์ ํ API๋ฅผ ์ํ ๋ค์์คํ์ด์ค
- DateTimeFormat
- NumberFormat
ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด
โ ๏ธ ํ๋กํ ํ์ ๊ฐ์ฒด
- ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ถ๋ชจ ๊ฐ์ฒด ๊ฒ๋
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ถ๋ชจ ๊ฐ์ฒด์ธ ํ๋กํ ํ์ ๊ฐ์ฒด์ ์ฐ๊ฒฐ
- ๋ถ๋ชจ๊ฐ์ฒด์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ
ํ๋กํ ํ์ ๊ฐ์ฒด ์ ๊ทผํ๊ธฐ
- ๋ชจ๋ ๊ฐ์ฒด๋ [[Prototype]] ์ธํฐ๋ ์ฌ๋กฏ์ ๊ฐ์ง๊ณ ์๋ค.
- __proto__๋ผ๋ ์ ๊ทผ์ ์์ฑ์ผ๋ก Object.prototype ๊ฐ์ฒด์ ์ ๊ทผ์ด ๊ฐ๋ฅํจ
ํ๋กํ ํ์ ๊ฐ์ฒด ์์ฑํ๊ธฐ
- ํจ์ ํ์ ์๋ง ์กด์ฌํ๋ prototype ํ๋
- ํจ์๋ฅผ ํ์ฉํ์ฌ ๋ถ๋ชจ๊ฐ์ฒด์ ์ธ์คํด์ค ์์ฑ ๊ฐ๋ฅ
- ์ธ์คํด์ค ๋ถ๋ชจ๊ฐ์ฒด == ์์ฑ์ํจ์.prototype
ํ๋กํ ํ์ ์ฒด์ธ (chain)
- ๊ฐ์ฒด ์์ฑ ์ฐธ์กฐ์, ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ํ๋กํ ํ์ ์ฒด์ธ์ด ๋์ํจ
- ๋ชจ๋ ๊ฐ์ฒด์ ๋ถ๋ชจ๋ Object.prototype โก๏ธ End of Prototype chain
- ๋ง์ฝ ๋ง์ง๋ง ๋ถ๋ชจ๊ฐ์ฒด์์๊น์ง ํด๋น ์์ฑ์ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ, Undefined
ํ๋กํ ํ์ ๊ฐ์ฒด ํ์ฅ๊ณผ ์์ฑ
- prototype ๊ฐ์ฒด ์์ฑ๊ณผ ๋ฉ์๋ ์ ์ ์ ์ธ์คํด์ค ๊ฐ์ฒด์์ ๋ถ๋ชจ ๋ฉ์๋์ ์์ฑ์ ์ฐธ์กฐํ๋ค.
- ๊ฐ์ฒด์ ํ๋กํ ํ์
์ ๋์ผํ ์ด๋ฆ์ ์์ฑ์ด๋ ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ์ฒด ์์ฑ ๋จผ์ ์ฐธ์กฐํจ
- property shadowing: ํ๋กํ ํ์ ์์ฑ์ด ๊ฐ๋ ค์ง๋ ํ์
- method overriding: ํ๋กํ ํ์ ๋ฉ์๋๊ฐ ๊ฐ๋ ค์ง๋ ํ์
Class
ES6+ Class
: ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์ ์ต์ํ ๊ฐ๋ฐ์๊ฐ ๋น ๋ฅด๊ฒ ํ์ตํ ์ ์๋๋ก ES6์ด์๋ถํฐ class ๋ฌธ๋ฒ์ด ์ถ๊ฐ๋จ (ํ๋กํ ํ์ ๊ธฐ๋ฐ ํจํด์ ๋ฌธ๋ฒ ์คํ)
Class ๋ฌธ๋ฒ
- constructor
- ์ธ์คํด์ค ์์ฑ ์ ํธ์ถ๋๋ ๋ฉ์๋
- ์ธ์คํด์ค ์์ฑ ์ ์ ๋ฌํ ์ธ์๋ฅผ constructor ๋ฉ์๋๋ฅผ ์ธ์๋ก ๋ฐ์ ์ ์๋ค.
- ์๋ต ๊ฐ๋ฅ
- ์ธ์คํด์ค ๋ฉ์๋
- ํด๋์ค ๋ด์ ์กด์ฌํ๋ ๋ฉ์๋
- ๋ฉ์๋ ๋ด์์ ํด๋์ค๋ฅผ this๋ก ์ ๊ทผ ๊ฐ๋ฅ
- ํด๋์ค์ ์ธ์คํด์ค ์์ฑ์๋ ์ ๊ทผ ๊ฐ๋ฅ
- ์ ์ ๋ฉ์๋
- ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ํธ์ถํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ
- static ํค์๋ ์ฌ์ฉ
- util์ฉ ํจ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
class Person {
constructor(age) {
this.age = age;
}
static legCount() {
return 2;
}
}
Person.legCount()
- ์ธ์คํด์ค ์์ฑ
- ํด๋์ค ๋ด๋ถ์ ์บก์ํ๋ ๋ณ์ === ๋ฉค๋ฒ ๋ณ์
- this์ ์ถ๊ฐํ ์์ฑ
- ์์ฑ์ ์ธ์คํด์ค ์์ฑ ์ดํ ๋ฐ๋ก ์ฐธ์กฐํด์ผ ํ๋ฏ๋ก, ์ธ์คํด์ค ์์ฑ ์ด๊ธฐํ๋ ๋ณดํต constructor์์ ์งํํจ
- getter
- ํน์ ์ธ์คํด์ค ์์ฑ์ ์กฐํํ๋ฉฐ ์กฐ์ํ๋ ๋ฉ์๋
- ์ด๋ฆ ์์ get ํค์๋๋ฅผ ์ฌ์ฉํด ์์ฑํ๋ฉฐ getter๋ฉ์๋๋ ๋ฌด์กฐ๊ฑด ๊ฐ์ ๋ฐํํด์ผ ํจ
- ์ฌ์ฉ ์, ์ผ๋ฐ ๋ฉ์๋์ฒ๋ผ ํธ์ถํ์ง ์๊ณ ์์ฑ์ฒ๋ผ ์ฐธ์กฐํ๋ ํ์์ผ๋ก ์ฌ์ฉ
- setter
- ํน์ ์ธ์คํด์ค ์์ฑ์ ํ ๋นํ๋ฉฐ ์กฐ์ํ๋ ๋ฉ์๋
- ๋ฉ์๋ ์ด๋ฆ ์์ set ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ ํ๋์ ์ธ์๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฐ๋๋ก ์ ์ํด์ผ ํจ
- ์ฌ์ฉ ์, ์ผ๋ฐ ๋ฉ์๋์ฒ๋ผ ํธ์ถํ์ง ์๊ณ ์์ฑ์ฒ๋ผ ํ ๋นํ๋ ํ์์ผ๋ก ์ฌ์ฉ
- ํด๋์ค ์์ - extends
- ์ฝ๋์ ์ฌ์ฌ์ฉ ๊ด์ ์์ ์์์ด ํ์ํจ
- extends, super ํค์๋๋ก ์์ ๊ตฌํ'
- super()
- ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถ
- ์์ ํด๋์ค์ ์์ฑ์๊ฐ this์ ์ ๊ทผํ๊ณ ์์ ๊ฐ๋ฅ
- ์์ ํด๋์ค์ constructor ์ฌ์ฉ ์ constructor ๋ฐํ๋ฌธ ์ ์ ๊ผญ ์ฌ์ฉํด์ผ ํจ
class ๋ถ๋ชจ { ... }
class ์์ extends ๋ถ๋ชจ {
constructor() {
super()
...
}
...
}
this
: ์ปจํ ์คํธ ์ฐธ์กฐ ๊ฐ๋ฅํ ํค์๋์ด๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์ญํ , ์ด๋ค ๊ฐ์ฒด์ธ์ง ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
โ ๏ธ ์ ์ญ๊ฐ์ฒด์์ this ์ฌ์ฉ ์, this๋
- ๋ธ๋ผ์ฐ์ : window
- server-side (node): global
ํจ์ ๋ด๋ถ์์ this๋ ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
โก๏ธ ๊ฐ์ฒด ๋ฉ์๋ ๋ด์ ๋ด๋ถ ํจ์๊ฐ ์์ ๊ฒฝ์ฐ, ํจ์ ํธ์ถ ๋ฐฉ์์ผ๋ก ์ทจ๊ธ๋์ด this๊ฐ ์ ์ญ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, this๋ฅผ ๋ค๋ฅธ ๋ณ์์ ์ ์ฅํ๊ณ ์ฌ์ฉํ๊ฑฐ๋ ๋ด๋ถ ํจ์๋ฅผ ํด๋น ๊ฐ์ฒด์ bind ํด์ผ ํจ
const foo = {
name: 'joy',
age: 28,
getName() {
const that = this
function getAge() {
console.log(that.age)
}
getAge()
}
}
foo.getName() // 28
const foo = {
name: 'joy',
age: 28,
getName() {
console.log(this.name)
}
}
const bar = {
name: 'kei'
}
bar.getName = foo.getName
foo.getName() // joy
bar.getName() // keiโ
this ๋ฐ์ธ๋ฉ - ์์ฑ์ ํจ์ ํธ์ถ๋ฐฉ์
- ๋น ๊ฐ์ฒด ์์ฑ, this ๋ฐ์ธ๋ฉ โก๏ธ this๋ ๋น ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ
- this๋ก ์์ฑ ์์ฑ โก๏ธ this๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ์์ฑ๊ณผ ๋ฉ์๋ ์์ฑ
- ์์ฑ๋ ๊ฐ์ฒด ๋ฐํ โก๏ธ ๋ฐํ๋ฌธ์ด ์์ด๋ 1๋ฒ์์ ์์ฑ๋์๋ ๊ฐ์ฒด๊ฐ ๋ฐํ ๋จ
this ๋ฐ์ธ๋ฉ - apply, call, bind
: this๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ
- Function.prototype.apply
- ํจ์๋ช .apply(๋ฐ์ธ๋ฉํ ๊ฐ์ฒด, [ํจ์ ํธ์ถ ์ ๋๊ธฐ๋ ์ธ์๋ค])
- Function.prototype.call
- ํจ์๋ช
.call(๋ฐ์ธ๋ฉํ ๊ฐ์ฒด, ํจ์ ํธ์ถ ์ ๋๊ธฐ๋ ์ธ์1, …)
- ํจ์ ๋ด์ this์ ๋ฐ์ธ๋ฉํ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ ๋จ
- ํจ์์ ์ธ์๋ค์ด ์ ๋ฌ๋จ
- ํจ์ ํธ์ถ
- ํจ์๋ช
.call(๋ฐ์ธ๋ฉํ ๊ฐ์ฒด, ํจ์ ํธ์ถ ์ ๋๊ธฐ๋ ์ธ์1, …)
- Function.prototype.bind
- ํจ์๋ช
.bind(๋ฐ์ธ๋ฉํ ๊ฐ์ฒด)
- ํจ์ ๋ด์ this์ ๋ฐ์ธ๋ฉํ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ
- ๋ฐ์ธ๋ฉ ๋ ํจ์ ๋ฐํ
- ํจ์๋ช
.bind(๋ฐ์ธ๋ฉํ ๊ฐ์ฒด)
apply, call์ ๋ฐ์ธ๋ฉํ ๋์์ ํจ์๋ฅผ ํธ์ถํ๋ฉฐ bind๋ ๋ฐ์ธ๋ฉ๊ณผ ํจ์ ํธ์ถ์ด ๋ถ๋ฆฌ๋์ด ์์
this ๋ฐ์ธ๋ฉ - ํ์ดํ ํจ์
: ํจ์๋ฅผ ์ ์ธํ ๋ this์ ๋ฐ์ธ๋ฉํ ๊ฐ์ฒด๊ฐ ์ ์ ์ผ๋ก ๊ฒฐ์ ๋๋ฉฐ ํญ์, ์์ ์ค์ฝํ this๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
const foo = {
name: 'joy',
age: 28,
getName: () => {
console.log(this.name) // ์ฌ๊ธฐ์ this๋ ์ ์ญ๊ฐ์ฒด
}
}
foo.getName() // ''
โ ๏ธ ํ์ดํ ํจ์๋ฅผ ์ง์ํด์ผ ํ๋ ์ฌ์ฉ ํํ
- ๊ฐ์ฒด์ ๋ฉ์๋ (+ prototype ๋ฉ์๋)
- ์์ฑ์ ํจ์ (ํ์ดํ ํจ์๋ prototype ๊ฐ์ฒด๊ฐ ์์)
Scope
: ๋ณ์๊ฐ ์ ํจ์ฑ์ ๊ฐ๋ ์์ญ
Scope ๊ท์น
- ์ ์ ์์ญ ๊ท์น lexical(static) scoping rule
- ์ด๋์ ํธ์ถํ์ง๊ฐ ์๋๋ผ, ์ด๋์ ์ ์ธํ์๋์ง์ ๋ฐ๋ผ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋จ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด ๊ท์น์ ๋ฐ๋ฆ
- ๋์ ์์ญ ๊ท์น dynamic scoping rule
- ์ด๋์ ํธ์ถํ์๋์ง์ ๋ฐ๋ผ ์ค์ฝํ ๊ฒฐ์
- ๋ฐํ์ ์ ๊ฒฐ์ ๋จ
Scope ์ข ๋ฅ
- ์ ์ญ ์ค์ฝํ: ์์ค ์ฝ๋์ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋ ์ ์ญ ๋ณ์
- file ์ค์ฝํ: ํด๋น ํ์ผ ์ ์ฒด์์ ์ ๊ทผ ๊ฐ๋ฅ
- ES6+ ์๋ฐ์คํฌ๋ฆฝํธ์์ <script type="module" ...>๋ก ์กฐํ๋๋ ํ์ผ
- ๋ชจ๋ ์ค์ฝํ
- ํจ์ ๋ ๋ฒจ ์ค์ฝํ
- ์ง์ญ๋ณ์: ํจ์ ๋ด์ ์ ํจํ ๋ณ์
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ๋ ๋ฒจ ์ค์ฝํ์ด๋ค.
- ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ
- ์ง์ญ๋ณ์: ์ฝ๋๋ธ๋ญ ๋ด์์ ์ ํจํ ๋ณ์
- ES6+ JS: let, const๋ ๋ธ๋ก๋ ๋ฒจ ์ค์ฝํ
๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ ์์)
const foo = 'foo'
{
const bar = 'bar'
}
console.log(bar) // ReferenceError: bar is not defined
ํจ์ ๋ ๋ฒจ ์ค์ฝํ ์์)
var foo = 'foo'
{
var bar = 'bar'
}
console.log(bar) // 'bar'
์คํ ์ปจํ ์คํธ
: ์ฝ๋๊ฐ ์คํ๋๋ ๋ฒ์์ ๋ํ ๊ฐ๋
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ํด ํ์ํ ์ ๋ณด
- ๋ณ์
- ํจ์ ์ ์ธ
- ๋ณ์์ ์ ํจ๋ฒ์ (์ค์ฝํ)
- this
โก๏ธ ์ด๋ฌํ ์ ๋ณด๋ฅผ ๋ฌผ๋ฆฌ์ ๊ฐ์ฒด ํํ๋ก ๊ด๋ฆฌํ๋ค.
์คํ ์ปจํ ์คํธ์ ์์ฑ ๋จ๊ณ - Createion Phase
์ฝ๋ ํ๊ฐ๋จ๊ณ์์ Lexical Environment ์์ฑ
- ํจ์์ ๋ณ์๋ฅผ ๊ธฐ๋ก (Environment Record)
- ์ ์ธ ์ ์, ๊ฐ์ฒด ์ ์
- this ๋ฐ์ธ๋ฉ: ํจ์ ํธ์ถ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง
- ์ธ๋ถ ํ๊ฒฝ ์ฐธ์กฐ (Outer Environment Reference)
- ์ค์ฝํ ์ฒด์ธ ํ์ฑ
์คํ ์ปจํ ์คํธ์ ์คํ ๋จ๊ณ - Execution Phase
์ฝ๋ ์คํ๋จ๊ณ์์ ์์์ ์๋๋ก ์ฝ๋๋ฅผ ์คํ
๋ณ์๋ ๊ฐ์ด ํ ๋น๋๊ณ ํจ์ ์คํ ์ฝ๋๊ฐ ์์ ๊ฒฝ์ฐ ํจ์๋ฅผ ์คํํ๋ค.
โ ์๋ฐ์คํฌ๋ฆฝํธ์ Call Stack
: ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํธ์ถ๋ ํจ์์ ์์๋ฅผ ์ถ์ ํ๋ ๋ฐฉ๋ฒ
- ์ด๋ค ํจ์๊ฐ ๋์ํ๊ณ ์๋์ง ๋ค์์ ์ด๋ค ํจ์๊ฐ ํธ์ถ๋์ด์ผ ํ๋์ง๋ฅผ ์ ์ดํจ
- Stack ์๋ฃ๊ตฌ์กฐ (LIFO)๋ฅผ ์ฌ์ฉํจ
- ์ฝ ์คํ: ํจ์ ํธ์ถ ์ ๋ง๋ค์ด์ง๋ ์คํ ์ปจํ ์คํธ๊ฐ ์์ด๊ณ ํ๋์ ์ผ๋ง ์ฒ๋ฆฌ ๊ฐ๋ฅํจ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ํ๊ฐํ์ฌ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ง๋ค์ด โก๏ธ ์ฝ ์คํ์ ํ๋์ฉ ์๊ณ โก๏ธ ์ฝ ์คํ์์ ์คํ ์ปจํ ์คํธ๋ฅผ ์คํํ๋ฉฐ โก๏ธ ์คํ์์ ํ๋์ฉ ์์ค๋ค.
ํด๋ก์
: ํจ์๊ฐ ์ข ๋ฃ๋์๋๋ฐ ์์ง ์ฐธ์กฐ๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ
โก๏ธ ์ธ๋ถ ํจ์ ์คํ ์ปจํ ์คํธ ํ๊ฒฝ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๋ด๋ถ ํจ์ ์คํ ์ปจํ ์คํธ
์์ ์ ํฌํจํ๊ณ ์๋ ์ธ๋ถํจ์๋ณด๋ค ๋ด๋ถํจ์๊ฐ ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ, ์ธ๋ถ ํจ์ ๋ฐ์์ ๋ด๋ถํจ์๊ฐ ํธ์ถ๋๋๋ผ๋ ์ธ๋ถํจ์์ ์ง์ญ ๋ณ์์ ์ ๊ทผํ ์ ์๋๋ฐ ์ด๋ฌํ ํจ์๋ฅผ ํด๋ก์ (Closure)๋ผ๊ณ ๋ถ๋ฅธ๋ค. - poiemaWeb
ํจ์๊ฐ ์ข ๋ฃ๋์ด๋ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ์ฌ ํน์ ์ค์ฝํ์ ์ ๊ทผํ ์ ์๋ ํจ์์ด๋ฉฐ ์ํ ์ ์ง, ์๋ํ์ ์ฌ์ฉํ๋ค.
๋ง๋ฌด๋ฆฌ
์ด์ ๋ถํฐ ๊ฐ์๊ฐ ๋๋ฌด ๋ง์์ ธ์ ์๋ฒฝ๊น์ง ๊ณต๋ถํ๋๋ผ ํ๋ค์๋ค. ๐ญ
์ง์ค๋ ฅ ํฅ์์ ์ํด ๋ฐฉ์ด๋ ์ฑ ์๋ ๊น๋ํ๊ฒ ์น์ฐ๊ณ ๊ณต๋ถํ ๊ฑฐ๋ง ๊บผ๋ด ๋์์ผ์ง.. ํ๋ฃจ์ข ์ผ ๊ต์ก์ ์ง์คํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค์ด์ผ๊ฒ ๋ค.
๋ผ์ ์์นจ ์ผ์ฐ ์ผ์ด๋์ ์ด๋ ๋ค๋ ์์ ๋ฐ๋ก ๊ณต๋ถํด์ผ์ง!