๐Ÿ’ก์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด

thumb_hyeokยท2022๋…„ 3์›” 15์ผ
0

๐ŸŸกย JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
5/15
post-thumbnail
post-custom-banner

๐Ÿค” ๊ฐ์ฒด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋ฉฐ, ์›์‹œ ๊ฐ’์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’์€ ๋ชจ๋‘ ๊ฐ์ฒด๋‹ค.

๊ฐ์ฒด๋Š” 0๊ฐœ ์ด์ƒ์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์ด๋ฉฐ, ํ”„๋กœํผํ‹ฐ๋Š” ํ‚ค(key)์™€ ๊ฐ’(value)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ํ•จ์ˆ˜์ผ ๊ฒฝ์šฐ, ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ(method)๋ผ ๋ถ€๋ฅธ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์ฒด๋‹ค.

  • ํ”„๋กœํผํ‹ฐ: ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€ํƒœ๋Š” ๊ฐ’(data)
  • ๋ฉ”์„œ๋“œ: ํ”„๋Ÿฌํผํ‹ฐ(์ƒํƒœ ๋ฐ์ดํ„ฐ)๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘(behavior)

์—”์ง„์ด ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ๊ตฌํ˜„ ์˜์กด์ (Implementation-Dependent)์ด๋‹ค. ๊ฐ์ฒด ์ปจํ…Œ์ด๋„ˆ์— ๋‹ด์ง€ ์•Š๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค. ๊ฐ์ฒด ์ปจํ…Œ์ด๋„ˆ์—๋Š” ์‹ค์ œ๋กœ ๊ฐ’์ด ์žˆ๋Š” ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ(๋ ˆํผ๋Ÿฐ์Šค) ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ช…์ด ๋‹ด๊ฒจ์žˆ๋‹ค.


ํ”„๋กœํผํ‹ฐ

๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ์˜ ์ง‘ํ•ฉ์ด๋ฉฐ ํ”„๋กœํผํ‹ฐ๋Š” ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
ํ”„๋กœํผํ‹ฐ ํ‚ค์™€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํ”„๋กœํผํ‹ฐ ํ‚ค: ๋นˆ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด ๋˜๋Š” ์‹ฌ๋ฒŒ ๊ฐ’
  • ํ”„๋กœํผํ‹ฐ ๊ฐ’: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’

์‹๋ณ„์ž ๋„ค์ด๋ฐ ๊ทœ์น™์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ๊ฐ’์„ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์™ธ์—๋„ ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž

  • ๋นˆ ๋ฌธ์ž์—ด์„ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉ : ๊ถŒ์žฅ X
  • ๋ฌธ์ž์—ด ๋˜๋Š” ๋ฌธ์ž์—ด๋กœ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„์‹์„ ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ : [...]๋กœ ๋ฌถ์–ด์•ผํ•จ
  • ํ”„๋กœํผํ‹ฐ ํ‚ค์— ๋ฌธ์ž์—ด์ด๋‚˜ ์‹ฌ๋ฒŒ ๊ฐ’ ์™ธ์˜ ๊ฐ’ ์‚ฌ์šฉ โ†’ ์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜์„ ํ†ตํ•ด ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
  • ํ”„๋กœํผํ‹ฐ ํ‚ค ์ค‘๋ณต ์„ ์–ธ โ†’ ๋‚˜์ค‘์— ์„ ์–ธํ•œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฎ์–ด์”€ (์—๋Ÿฌ ๋ฐœ์ƒ X)

๋ฉ”์„œ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด(์ผ๊ธ‰ ๊ฐ์ฒด)๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋Š” ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋œ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋ผ ๋ถ€๋ฅธ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ƒ๊ฐ๋ณด๋‹ค ๋ฉ”์„œ๋“œ๋กœ ์ธ์ •๋˜๋Š” ๋ฒ”์œ„๊ฐ€ ์ƒ๋‹นํžˆ ์ข๋‹ค. ์ด๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๋ฉด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.


ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ๋ฒ•

  • ๋งˆ์นจํ‘œ ํ‘œ๊ธฐ๋ฒ•(dot notation) : ๋งˆ์นจํ‘œ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ์—ฐ์‚ฐ์ž(.)๋ฅผ ์‚ฌ์šฉ
  • ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•(bracket notation) : ๋Œ€๊ด„ํ˜ธ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ์—ฐ์‚ฐ์ž([...])๋ฅผ ์‚ฌ์šฉ
const crew = {
	name: 'Harry',
	greeting: function () {
		console.log(`Hello!, I'm ${this.name});
	}
}

console.log(crew.name) // Harry
console.log(crew["name"]) // Harry

ํ”„๋กœํผํ‹ฐ ํ‚ค๊ฐ€ ์‹๋ณ„์ž ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœํผํ‹ฐ ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ผ ๋ฌธ์ž์—ด์ด์–ด์•ผํ•œ๋‹ค. ๋‹จ, ํ”„๋กœํผํ‹ฐ ํ‚ค๊ฐ€ ์ˆซ์ž๋กœ ์ด๋ค„์ง„ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ ๋”ฐ์˜ดํ‘œ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.


[[Get]], [[Set]]

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด๋Š” Essential Internal Methods๋กœ [[Get]], [[Set]] ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋Š” ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ์„ธํŒ…ํ•  ๋•Œ ๊ฐ๊ฐ์ด ์‚ฌ์šฉ๋œ๋‹ค.

const myObject = {
	a: 2
}
myObject.a; //2

myObject.a๋Š” ๋ˆ„๊ฐ€ ๋ด๋„ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ์ด์ง€๋งŒ a๋ž€ ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ myObject์—์„œ ์ฐพ์ง€ ์•Š๋Š”๋‹ค. ๋ช…์„ธ์— ๋”ฐ๋ฅด๋ฉด ์ด ์ฝ”๋“œ๋Š” myObject์— ๋Œ€ํ•ด [[Get]] ์—ฐ์‚ฐ์„ ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ [[Get]] ์—ฐ์‚ฐ์€ ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋จผ์ € ์ฐพ์•„๋ณด๊ณ  ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์„, ์–ด๋–ป๊ฒŒ ํ•ด๋„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

const myObject = {
	a: 2
}
myObject.a = 3; 
console.log(myObject.a) //3

์ด๋Š” myObject์˜ a๋ž€ ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” [[Set]] ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋ฉด ์ฃผ์–ด์ง„ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์š”์†Œ์— ๋”ฐ๋ผ ์ดํ›„์˜ ์ž‘๋™ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„๋‹ค. [[Set]] ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๋Œ€๋žต ๋‹ค์Œ์˜ ํ™•์ธ ์ ˆ์ฐจ๋ฅผ ๋ฐŸ๋Š”๋‹ค.

  1. ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ ‘๊ทผ ์„œ์ˆ ์ž(Accessor Descriptor)์ด๋ฉด ์„ธํ„ฐ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  2. ํ”„๋กœํผํ‹ฐ๊ฐ€ writable:false์ธ ๋ฐ์ดํ„ฐ ์„œ์ˆ ์ž(Data Descriptor)์ด๋ฉด ์‹คํŒจํ•œ๋‹ค(์—„๊ฒฉ์€ TypeError)
  3. ์ด์™ธ์—๋Š” ํ”„๋กœํผํ‹ฐ์— ํ•ด๋‹น ๊ฐ’์„ ์„ธํŒ…ํ•œ๋‹ค..

๐Ÿชง ๊ฐ์ฒด์˜ ์ƒ์„ฑ๋ฐฉ์‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์€ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋กœ์„œ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค.

  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด
  • Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜
  • Object.create ๋ฉ”์„œ๋“œ
  • ํด๋ž˜์Šค (ES6)

์ง€๊ธˆ์€ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•œ ๋ฐฉ์‹๊ณผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋“ค์— ์˜ํ•œ ๋ฐฉ์‹๋งŒ ์‚ดํŽด๋ณด๋„๋กํ•˜๊ฒ ๋‹ค.


๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ

์ด๋Ÿฌํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ค‘ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์€ ์ค‘๊ด„ํ˜ธ ๋‚ด์— 0๊ฐœ ์ด์ƒ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•œ๋‹ค. ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๋Š” ์‹œ์ ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ•ด์„ํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ์ค‘๊ด„ํ˜ธ๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ํ‘œํ˜„์‹์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ค‘๊ด„ํ˜ธ์˜ ๋งˆ์ง€๋ง‰์—๋Š” ํ‘œํ˜„์‹์˜ ๋์„ ์•Œ๋ฆฌ๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ๋ถ™์ธ๋‹ค.)

const crew = {
	name: 'Harry',
	greeting: function () {
		console.log(`Hello!, I'm ${this.name});
	}
}

ES6์—์„œ ์ถ”๊ฐ€๋œ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ํ™•์žฅ ๊ธฐ๋Šฅ

ํ”„๋กœํผํ‹ฐ ์ถ•์•ฝ ํ‘œํ˜„

ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ณ€์ˆ˜๋ช…๊ณผ ํ”„๋กœํผํ‹ฐ ํ‚ค๊ฐ€ ๋™์ผํ•œ ์ด๋ฆ„์ผ ๋•Œ ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ์ƒ๋žต(property shorthand)ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ํ”„๋กœํผํ‹ฐ ํ‚ค๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.


๊ณ„์‚ฐ๋œ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„

๋ฌธ์ž์—ด ๋˜๋Š” ๋ฌธ์ž์—ด๋กœ ํƒ€์ž… ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹จ, ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ํ‘œํ˜„์‹ค์„ ๋Œ€๊ด„ํ˜ธ([...])๋กœ ๋ฌถ์–ด์•ผํ•œ๋‹ค.
์ด๋ฅผ ๊ณ„์‚ฐ๋œ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„(computed property name)์ด๋ผ ํ•œ๋‹ค.

(ES5์—์„œ๋Š” ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์™ธ๋ถ€์—์„œ๋งŒ ๊ณ„์‚ฐ๋œ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์œผ๋กœ ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋™์ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.)

const prefix = 'prop'
let i = 0;

const obj = {
	[`${prefix}-${++i}`]: i, // prop-1: 1
	[`${prefix}-${++i}`]: i, // prop-2: 2
	[`${prefix}-${++i}`]: i  // prop-3: 3
}

๋ฉ”์„œ๋“œ ์ถ•์•ฝํ‘œํ˜„
//ES5
var obj = {
	myFunc: function() {
		console.log('Hello, World!');
	}
}

//ES6
const obj = {
	myFunc() {
		console.log('Hello, World!');
	}
}

๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„์œผ๋กœ ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹น๋œ ํ•จ์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.


์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ

์ƒ์„ฑ์ž ํ•จ์ˆ˜(constructor)๋ž€ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์™ธ์—๋„ String, Number, Function ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋นŒํŠธ์ธ(built-in) ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹์˜ ์žฅ์ ๊ณผ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์˜ ๋‹จ์ 

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹ : ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋น„ํšจ์œจ์ 
์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹ : ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ(ํด๋ž˜์Šค)์ฒ˜๋Ÿผ ์‚ฌ์šฉ. ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑํ•  ๋•Œ ํšจ์œจ์ 


์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๊ณผ์ •

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ์•”๋ฌต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ์•”๋ฌต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค
  2. ๋นˆ ๊ฐ์ฒด, ์ฆ‰ ์ธ์Šคํ„ด์Šค๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค (์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๋Ÿฐํƒ€์ž„์ด์ „์— ์‹คํ–‰๋œ๋‹ค.)
  3. ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™” (์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ ์ดˆ๊ธฐ๊ฐ’ ํ• ๋‹น)
  4. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค (๋งŒ์•ฝ this๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด this๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ๋ชปํ•˜๊ณ  return๋ฌธ์— ๋ช…์‹œํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋‹ค๋œ๋‹ค. ์›์‹œ ๊ฐ’ ๋ฐ˜ํ™˜์€ ๋ฌด์‹œ๋œ๋‹ค.)

๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[Call]]๊ณผ [[Construct]]

ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ ์ผ๋ฐ˜ ๊ฐ์ฒด(ordinary object)์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด์ง€๋งŒ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€๋Š” ๋‹ค๋ฅด๋‹ค. ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋ฌผ๋ก , ํ•จ์ˆ˜๋กœ์„œ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•œ [[Environment]], [[FormalParameters]] ๋“ฑ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ [[Call]], [[Construct]] ๊ฐ™์€ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ - [[Call]] ํ˜ธ์ถœ
  • ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ - [[Construct]] ํ˜ธ์ถœ

๋ชจ๋“  ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” [[Call]]์„ ๊ฐ€์ง€์ง€๋งŒ, ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ [[Construct]]๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•œ๋‹ค.
๋ชจ๋“  ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ์•„๋ž˜๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.

callable & constructor || callable & non-constructor

  • constructor: ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹, ํด๋ž˜์Šค
  • non-constructor: ๋ฉ”์„œ๋“œ (ES6 ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„), ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

new.target

์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ new ์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ new.target์€ ํ•จ์ˆ˜ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. new ์—ฐ์‚ฐ์ž ์—†์ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ new.target์€ undefined์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฐธ๊ณ ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ์ ˆํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Object์™€ Function ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” new ์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœํ•ด๋„ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.


๐Ÿงฌ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ

๋‚ด๋ถ€ ์Šฌ๋กฏ(internal slot)๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ(internal method)๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ECMAScript ์‚ฌ์–‘์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜์‚ฌ ํ”„๋กœํผํ‹ฐ(pseudo property)์™€ ์˜์‚ฌ ๋ฉ”์„œ๋“œ(pseudo method)์ด๋‹ค. ECMAScript ์‚ฌ์–‘์— ๋“ฑ์žฅํ•˜๋Š” ์ด์ค‘ ๋Œ€๊ด„ํ˜ธ([[...]])๋กœ ๊ฐ์‹ผ ์ด๋ฆ„๋“ค์ด ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์ด๋‹ค.

๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋งค์„œ๋“œ๋Š” ECMAScript ์‚ฌ์–‘์— ์ •์˜๋œ ๋Œ€๋กœ ๊ตฌํ˜„๋˜์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์™ธ๋ถ€๋กœ ๊ณต๊ฐœ๋œ ํ”„๋กœํผํ‹ฐ๋Š” ์•„๋‹ˆ๋‹ค. (ํ”„๋กœํผํ‹ฐ๋„ ์•„๋‹ˆ๋‹ค) ์›์น™์ ์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผ, ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋‚˜, ์ผ๋ถ€ ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์— ํ•œํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•œ๋‹ค.


ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜ํ•œ๋‹ค. value, writable, enumerable, configurable๋ฅผ ๋งํ•œ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๊ด€๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ์ƒํƒœ ๊ฐ’(meta-property)์ธ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]์ด๋‹ค.

๋”ฐ๋ผ์„œ Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ(PropertyDescriptor) ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ(Data Property)์™€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ(Accessor Property)๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ES5๋ถ€ํ„ฐ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ(Property Descriptor)๋กœ ํ‘œํ˜„๋œ๋‹ค.
ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ํ”„๋กœํผํ‹ฐ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ(Data Property Descript)์™€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ (Accessor Property Descriptor)๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ : ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ, ์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋‹ค.
  • ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ : ์ž์ฒด์  ๊ฐ’ X, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜(accessor function)์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ๋‹ค.

๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ

๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ์—๋Š” 4๊ฐ€์ง€ ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์กด์žฌํ•œ๋‹ค

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์„ค๋ช…
[[Value]]valueํ”„๋กœํผํ‹ฐ ๊ฐ’
[[Writable]]writableํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
[[Enumerable]]enumerableํ”„๋กœํผํ‹ฐ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
[[Configurable]]configurableํ”„๋กœํผํ‹ฐ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
  • value
    ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์ด๋‹ค.
    ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด [[Value]]์— ๊ฐ’์„ ์žฌํ• ๋‹นํ•œ๋‹ค.
    ์ด๋•Œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์œผ๋ฉด ํ”„๋กœํผํ‹ฐ๋ฅผ ๋™์  ์ƒ์„ฑํ•˜๊ณ  ์ƒ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ์˜ [[Value]]์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

  • writable
    ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์กฐ์ •ํ•œ๋‹ค
    ์“ฐ๊ธฐ ๊ธˆ์ง€๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์กฐ์šฉํžˆ ์‹คํŒจํ•˜๋ฉฐ, ์—„๊ฒฉ ๋ชจ๋“œ์—์„  TypeError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • configurable
    configurable๊ฐ€ true๋ผ๋ฉด defineProperty()๋กœ ํ”„๋กœํผํ‹ฐ ์„œ์ˆ ์ž๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    false๋ผ๋ฉด defineProperty() ํ˜ธ์ถœ ์‹œ ์—„๊ฒฉ ๋ชจ๋“œ์™€ ์ƒ๊ด€์—†์ด TypeError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    delete ์—ฐ์‚ฐ์ž๋กœ ์กด์žฌํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ๋„ ๊ธˆ์ง€๋œ๋‹ค.
    ๋‹จ, [[Writable]]์ด true์ธ ๊ฒฝ์šฐ [[Value]]์˜ ๋ณ€๊ฒฝ๊ณผ [[Writable]]์„ false๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋œ๋‹ค.
  • enumerable
    enumberable์€ for...in ๋ฃจํ”„์ฒ˜๋Ÿผ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๋ฅผ ์—ด๊ฑฐํ•˜๋Š” ๊ตฌ๋ฌธ์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ํ‘œ์ถœ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. false๋ผ๋ฉด ์ง€์ •๋œ ํ”„๋กœํผํ‹ฐ๋Š” ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋ฃจํ”„ ๊ตฌ๋ฌธ์—์„œ ๊ฐ์ถฐ์ง„๋‹ค

์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

ES5๋ถ€ํ„ฐ๋Š” getter/setter๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ์ˆ˜์ค€์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ๋กœ์ง์„ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
getter/setter๋Š” ๊ฐ๊ฐ ์‹ค์ œ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”/์„ธํŒ…ํ•˜๋Š” ๊ฐ์ถฐ์ง„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋‹ค. ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’, writable, configurable, enumerable ์†์„ฑ์ด ๋ฌด์‹œ๋˜๋ฉฐ, ๋Œ€์‹ ์— ํ”„๋กœํผํ‹ฐ์˜ ๊ฒŸ(Get)/์…‹(Set) ์†์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค.

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์„ค๋ช…
[[Get]]getgetter ํ•จ์ˆ˜ ํ˜ธ์ถœ
[[Set]]setsetter ํ•จ์ˆ˜ ํ˜ธ์ถœ
[[Enumerable]]enumerable๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™์Œ
[[Configurable]]configurable๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™์Œ
  • get
    ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋‹ค.
    ์ฆ‰, ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Get]]์˜ ๊ฐ’, ์ฆ‰ getter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.
  • set
    ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋‹ค.
    ์ฆ‰, ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Set]]์˜ ๊ฐ’, ์ฆ‰ setter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€

ES5๋ถ€ํ„ฐ๋Š” ํ”„๋กœํผํ‹ฐ/๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์–•์€ ๋ถˆ๋ณ€์„ฑ(Shallow Immutability)๋งŒ ์ง€์›ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ผ›์†๊นŒ์ง€ ๊ณ ์ •๋œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์“ธ ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค.

  • ๊ฐ์ฒด ์ƒ์ˆ˜
    writable:false, configurable:false๋ฅผ ๊ฐ™์ด ์“ฐ๋ฉด ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์ˆ˜์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€
    ๊ฐ์ฒด์— ๋”๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๊ฒŒ ์ฐจ๋‹จํ•˜๊ณ  ํ˜„์žฌ ํ”„๋กœํผํ‹ฐ๋Š” ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋†”๋‘๊ณ  ์‹ถ์„ ๋•Œ
    Object.preventExtensions()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • ๊ฐ์ฒด๋ด‰์ธ
    Object.seal()์€ ๋ด‰์ธ๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    ์–ด๋–ค ๊ฐ์ฒด์— ๋Œ€ํ•ด Object.preventExtensions()๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํ”„๋กœํผํ‹ฐ๋ฅผ ์ „๋ถ€ configurable:false ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ๊ฐ์ฒด ๋™๊ฒฐ
    Object.freeze()๋Š” ๊ฐ์ฒด๋ฅผ ๊ฝ๊ฝ์–ผ๋ฆฐ๋‹ค.
    Object.seal()๋ฅผ ์ ์šฉํ•˜๊ณ , ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ writable:false ์ฒ˜๋ฆฌํ•ด์„œ ๊ฐ’๋„ ๋ชป ๋ฐ”๊พธ๊ฒŒ ํ•œ๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋””๊นŒ์ง€๋‚˜ ์ง์† ํ”„๋กœํผํ‹ฐ๊นŒ์ง€๋งŒ ๋ด‰์‡„ํ•œ๋‹ค (์–•์€ ๋ด‰์‡„)

๊ฐ์ฒด๊ฐ€ ๊ฐ–๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ Object.freeze๋ฅผ ํ˜ธ์ถœํ•ด ๋ถˆ๋ณ€๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ—‚๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด์˜ ๋ถ„๋ฅ˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํฌ๊ฒŒ 3๊ฐœ์˜ ๊ฐ์ฒด๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด(standard built-in object / native objects / global object)
    ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด๋Š” ECMASCript ์‚ฌ์–‘์— ์ •์˜๋œ ๊ฐ์ฒด์ด๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ (๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js ํ™˜๊ฒฝ)๊ณผ ๊ด€๊ณ„์—†์ด ์–ธ์ œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด๋Š” ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ์„œ ์ œ๊ณต๋œ๋‹ค.

  • ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด (host object)
    ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๋Š” ECMAScript ์‚ฌ์–‘์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” DOM, BOM, Fetch ๋“ฑ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ API๋ฅผ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๋กœ ์ œ๊ณตํ•˜๊ณ  Node.js ํ™˜๊ฒฝ์—์„œ๋Š” Node.js ๊ณ ์œ ์˜ API๋ฅผ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๋กœ ์ œ๊ณตํ•œ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด (user-defined object)
    ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•œ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.


๐Ÿง ์ •๋ฆฌ

  • ๊ฐ์ฒด๋ž€ ์›์‹œ ๊ฐ’์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’์ด๋ฉฐ, 0๊ฐœ ์ด์ƒ์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์ด๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
  • ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค.
  • ํ”„๋กœํผํ‹ฐ๋Š” ES5๋ถ€ํ„ฐ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ ํ‘œํ˜„๋œ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด๋Š” ํฌ๊ฒŒ ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด, ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด, ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

(์ด์™ธ์—๋„ ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด ๋งŽ์œผ๋ฉฐ ํ”„๋กœํ† ํƒ€์ž…, ํด๋ž˜์Šค, ํ•จ์ˆ˜ ๋“ฑ์˜ ๊ธ€์—์„œ ๋” ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.)


๐Ÿ“– ์ฐธ๊ณ ์ž๋ฃŒ

  • ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

      1. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด (124p~135p)
      1. ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ (219p~232p)
      1. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ (234p~246p)
      1. ๋นŒํŠธ์ธ ๊ฐ์ฒด (320p~339p)
  • YOU DONโ€™T KNOW JS

      1. ๊ฐ์ฒด (65p~92p)
  • ECMAScriptยฎ 2022 Languageย Specification

profile
์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค 4๊ธฐ ์›น ํ”„๋ก ํŠธ์—”๋“œ
post-custom-banner

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