๐Ÿธ [JavaScript] ์ƒ์„ฑ์ž ํ•จ์ˆ˜

hnyoojinยท2024๋…„ 9์›” 8์ผ

๐Ÿธ JS ๋งˆ์Šคํ„ฐ ๋˜๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
16/19
post-thumbnail

์•ž์„œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ ๋ฐ” ์žˆ๋‹ค.

๊ต‰์žฅํžˆ ๊ฐ„ํŽธํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

๋™์ผ property๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค.

์ด๋Ÿด ๋•Œ์— ๋ฆฌํ„ฐ๋Ÿด๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
(์ด์™ธ์—๋„ ๋‹ค๋ฅธ built-in ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋“ค์ด ๋ช‡ ๊ฐœ ์žˆ๋‹ค.)


instance

new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด,
๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋•Œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋ฅผ instance ๋ผ๊ณ  ํ•œ๋‹ค.

์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ ํ•จ์ˆ˜์™€ ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฑธ๊นŒ?

์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ •์˜ ๋ถ€๋ถ„์€ ๋ณ„ ๋‹ค๋ฅธ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ new ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์€, instance๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,
์ƒ์„ฑ๋œ instance๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ -์ดˆ๊ธฐํ™”๋Š” ์˜ต์…˜ ์‚ฌํ•ญ์ด๋‹ค- ์„ ๋งํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ instance ์ƒ์„ฑํ•˜๋Š” ๊ฑธ๊นŒ?

JavaScript ์—”์ง„์€, ์•”๋ฌต์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด instance๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ์ด ๋นˆ ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ instance์ด๋‹ค.

์ด instance๋Š” this์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

๋ฐ”์ธ๋”ฉ์ด๋ž€ ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

instance๊ฐ€ this์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค๋Š” ๊ฑด, this ์™€ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ์ฒด ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ์€ ๊ฐœ๋ฐœ์ž์˜ ์˜์—ญ์ด๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” instance๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

์ฆ‰ instance์— property๋‚˜ method๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ,
์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ดˆ๊ธฐ๊ฐ’์„ instance property์— ํ• ๋‹นํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๊ณ ์ •๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด, ์™„์„ฑ๋œ instance๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ this๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜ ํ•œ๋‹ค.

์ด๋•Œ ๋งŒ์•ฝ this๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด?

this๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ๋ชปํ•˜๊ณ , return ๋ฌธ์— ๋ช…์‹œํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

์ด ๊ฒฝ์šฐ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ํ›ผ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, return๋ฌธ์€ ๋ฐ˜๋“œ์‹œ ์ƒ๋žตํ•˜๋„๋ก ํ•˜์ž.



ํ•จ์ˆ˜์™€ ๊ฐ์ฒด

ํ•จ์ˆ˜ ๋˜ํ•œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ฐ˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” internal slot๊ณผ internal method๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” internal slot, internal method๋ฅผ ํฌํ•จํ•ด์„œ,
ํ•จ์ˆ˜ ๊ฐ์ฒด ๋งŒ์„ ์œ„ํ•œ [[Environment]] [[FormalParamenters]] ๋“ฑ์˜ internal slot๊ณผ
[[Call]] [[Construct]] ์™€ ๊ฐ™์€ internal method๋˜ํ•œ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

(์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜๋ฉด [[Call]]์ด, new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜๋ฉด [[Construct]]๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.)
[[Call]]๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ callable์ด๋ผ๊ณ  ํ•˜๊ณ , [[Construct]]๋ฅผ ๊ฐ€์ง€๋ฉด constructor, ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉด non-constructor๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” constructor์ผ ์ˆ˜๋„ ์žˆ๊ณ  non-constructor์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•œ๊นŒ?

constructor vs. non-constructor

JavaScript ์—”์ง„์€, ํ•จ์ˆ˜๋ฅผ ์ •์˜ ํ‰๊ฐ€ํ•˜์—ฌ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ,
ํ•จ์ˆ˜ ์ •์˜ ๋ฐฉ์‹์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋ฅผ constructor์™€ non-constructor๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

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

๊ทผ๋ฐ ์ด ๋ฉ”์„œ๋“œ๋ผ๋Š” ๊ฒŒ, ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์ข์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜๋ฅผ property ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ non-constructor์˜ ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„๋งŒ์„ ์นญํ•˜๋Š” ๋ง์ด๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์œ„์˜ ๋ถ„๋ฅ˜์— ๋”ฐ๋ฅด๋ฉด, ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋งŒ์ด constructor์ด๊ณ , ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„์œผ๋กœ ์ •์˜ ๋œ ํ•จ์ˆ˜๋Š” non-constructor๋ผ๋Š” ๊ฒƒ์ด๋‹ค.


new

๋งˆ์ง€๋ง‰์œผ๋กœ new ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์ž.

์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ„์˜ ํ˜•์‹์ ์ธ ์ฐจ์ด๋Š” ์—†๋‹ค๊ณ  ํ–ˆ๋‹ค.

new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.

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

์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ new ์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, Pascal case convention์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ• ๋งŒ์œผ๋กœ๋Š” ์–ธ์ œ๋“  ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋•Œ๋ฌธ์— ์œ„ํ—˜์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ES6์—์„œ๋Š” new.target ์ง€์›์„ ๋„์ž…ํ–ˆ๋‹ค.

this์™€ ์œ ์‚ฌํ•˜๊ฒŒ, constructor๋Š” ๋ชจ๋“  ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์•”๋ฌต์ ์ธ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋œ๋‹ค.
(๋ฉ”ํƒ€ ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.)

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ new.target์„ ์‚ฌ์šฉํ•˜๋ฉด, new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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

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

=> ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ new.target์„ ์‚ฌ์šฉํ•ด์„œ
new ์—ฐ์‚ฐ์ž์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.


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