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

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

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

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

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

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ Object.getOwnPropertyDesciptor๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Object.getOwnPropertyDesciptor๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์ด ๋•Œ Object.getOwnPropertyDesciptor๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

ํ”„๋กœํผํ‹ฐ๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ(get/set ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง)๋‚˜ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ(value๋ฅผ ๊ฐ€์ง) ์ค‘ ํ•œ ์ข…๋ฅ˜์—๋งŒ ์†ํ•˜๊ณ  ๋‘˜ ๋‹ค์— ์†ํ•  ์ˆ˜ ์—†๋‹ค.

  • ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ : ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ
  • ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ : ์ž์ฒด์ ์œผ๋กœ๋Š” ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋–ผ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ

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

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

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

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

์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋Š” getter/setter ํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

๐Ÿง ํ”„๋กœํ†  ํƒ€์ž…

ํ”„๋กœํ†  ํƒ€์ž…์€ ์–ด๋–ค ๊ฐ์ฒด์˜ ์ƒ์œ„(๋ถ€๋ชจ) ๊ฐ์ฒด์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์€ ํ•˜์œ„(์ž์‹) ๊ฐ์ฒด์—๊ฒŒ ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†ํ•œ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์€ ํ•˜์œ„ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์„œ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŒผ 16.4 ํ”„๋กœํผํ‹ฐ ์ •์˜

ํ”„๋กœํผํ‹ฐ ์ •์˜๋ž€ ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ์˜ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค. Object.defineProperty๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœํผํ‹ฐ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŒผ 16.5 ๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€

16.5.1 ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€

Object.preventExtensions ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ํ™•์žฅ์„ ๊ธˆ์ง€ํ•œ๋‹ค. ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€๋ž€ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๊ธˆ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ํ™•์žฅ์ด ๊ธˆ์ง€๋œ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€๊ฐ€ ๊ธˆ์ง€๋œ๋‹ค.

16.5.2 ๊ฐ์ฒด ๋ฐ€๋ด‰

Object.seal ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ€๋ด‰ํ•œ๋‹ค. ๊ฐ์ฒด ๋ฐ€๋ด‰์ด๋ž€ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ์™€ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜ ๊ธˆ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ๋ฐ€๋ด‰๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

16.5.3 ๊ฐ์ฒด ๋™๊ฒฐ

Object.freeze ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•œ๋‹ค. ๊ฐ์ฒด ๋™๊ฒฐ์ด๋ž€ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ’ ์‚ญ์ œ์™€ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜ ๊ธˆ์ง€, ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๊ฐฑ์‹  ๊ธˆ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

16.5.4 ๋ถˆ๋ณ€ ๊ฐ์ฒด

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

Ref
https://velog.io/@bigbrothershin/JavaScript-%EC%A0%91%EA%B7%BC%EC%9E%90-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-getter-setter

profile
์ด์‚ฌ์ค‘์ž…๋‹ˆ๋‹ค!๐ŸŒŸhttps://velog.io/@devkyoung2

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด