-
์๋ฐ์คํฌ๋ฆฝํธ์ Getter / Setter์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 11. 06:29
TLDR;
์๋ฐ์คํฌ๋ฆฝํธ์ Getter / Setter๋ ์ ๊ทผ์ ํ๋กํผํฐ๋ก, ํ๋กํผํฐ์ ๊ฐ์ ํต์ ํ๊ฑฐ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฐํ๊ฒ ๋์ฒํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๋ค๋ฅด๊ฒ [[Value]]ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์, setter์ getter๋ก ์ ์ํ ์ ๊ทผ์ ํ๋กํผํฐ๋ ์ฝ๊ณ ์ธ ์ ์์ง๋ง ์ฝ์๋ก ํ์ธํ์ ๋์๋ ์ค์ ๋ก๋ ์กด์ฌํ์ง ์๋ ๊ฐ์์ ํ๋กํผํฐ์ด๋ค.
๋ฐ์ดํฐ ํ๋กํผํฐ vs ์ ๊ทผ์ ํ๋กํผํฐ
์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํผํฐ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
๊ตฌ๋ถ ์ค๋ช ๋ฐ์ดํฐ ํ๋กํผํฐ(data property) ํค-๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ, ์ง๊ธ๊น์ง ๋ด๊ฐ ์๋ ๋์ ๋ณด์ด๋ ๊ทธ ํ๋กํผํฐ ์ ๊ทผ์ ํ๋กํผํฐ(accessor property) ์์ฒด์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ง ์๊ณ ([[Value]]), ๊ฐ์ ์ฝ๊ฑฐ๋(Getter) ์ ์ฅ(Setter)ํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ํ๋กํผํฐ ๊ตฌ๋ถ ๋ฐฉ๋ฒ
๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ๊ตฌ๋ถํ๋ ๊ฐ์ฅ ๋ช ํํ ๋ฐฉ๋ฒ์, ๋ ํ๋กํผํฐ๊ฐ ๊ฐ์ง๊ณ ์๋
ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ
๋ฅผ ํ์ธํด ๋ณด๋ ๊ฒ์ด๋ค. ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ญ๋ฐ?ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ๋?
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด
์ด๋ค.์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋
ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์ํ๋ค.ํ๋กํผํฐ์ ์ํ
๋ ํ๋กํผํฐ์ ๊ฐ(value), ๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅ ์ฌ๋ถ(writable), ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ(enumerable), ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ(configurable) ๋ฑ์ ๋งํ๋ฉฐ,ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ด๋ฆฌํ๋ ๋ด๋ถ ์ํ ๊ฐ(meta-property)์ธ ๋ด๋ถ ์ฌ๋กฏ [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]์ ์๋ฏธํ๋ค.ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ ๋ด๋ถ ์ฌ๋กฏ์ด๊ธฐ ๋๋ฌธ์ ์ง์ ์ ๊ทผํ ์๋ ์์ง๋ง
Object.getOwnPropertyDescriptor
ํน์Object.getOwnPropertyDescriptors
๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
๋ฐ์ดํฐ ํ๋กํผํฐ
๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ๋ ํ๋กํผํฐ๋ฅผ ๋ฐ์ดํฐ ํ๋กํผํฐ๋ผ๊ณ ํ๋ค. ์ด ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ ์ค๋ช [[Value]] value ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ๋๋ ๊ฐ [[Writable]] writable ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ / default : true [[Enumerable]] enumerable ํ๋กํผํฐ์ ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ, ์ฆ for...in ํน์ Object.keys ๋ฉ์๋ ์ฌ์ฉ๊ฐ๋ฅ ์ฌ๋ถ / default : true [[Configurable]] configurable ํ๋กํผํฐ์ ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ, false์ธ ๊ฒฝ์ฐ ํด๋น ํ๋กํผํฐ์ ์ญ์ ๋ฐ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ๋ณ๊ฒฝ์ด ๊ธ์ง๋๋ค. ์ ๊ทผ์ ํ๋กํผํฐ
๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ๋ ํ๋กํผํฐ๋ฅผ ์ ๊ทผ์ ํ๋กํผํฐ๋ผ๊ณ ํ๋ค. ์์ฒด์ ์ผ๋ก ๊ฐ์ ๊ฐ์ง ์๊ณ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ์ ๊ทผ์ ํจ์(setter, getter)๋ก ๊ตฌ์ฑ๋ ํ๋กํผํฐ๋ค. ์ ๊ทผ์ ํ๋กํผํฐ์
๋ณธ์ง์ 'ํจ์'์ด์ง๋ง ์ธ๋ถ ์ฝ๋์์๋ ํจ์๊ฐ ์๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ์ฒ๋ผ ๋ณด์ธ๋ค
.ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ ์ค๋ช [[Get]] get ์ธ์๊ฐ ์๋ ํจ์๋ก(getter), ํ๋กํผํฐ ๊ฐ์ ์ฝ์ด์ฌ ๋ ๋์ํ๋ค. [[Set]] set ์ธ์๊ฐ ํ๋์ธ ํจ์๋ก(setter), ํ๋กํผํฐ์ ๊ฐ์ ์ธ ๋ ์ฌ์ฉ๋๋ค. [[Enumerable]] enumerable ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๋์ผ [[Configurable]] configurable ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๋์ผ setter์ getter์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ
let obj = { get propName() { // getter, obj.propName์ ์คํํ ๋ ์คํ๋๋ ์ฝ๋ }, set propName(value) { // setter, obj.propName = value๋ฅผ ์คํํ ๋ ์คํ๋๋ ์ฝ๋ } }; console.log(obj); // {} console.log(Object.getOwnPropertyDescriptors(obj)); // {propName: {get: propName(), set: propName(value), enumerable: true, configurable: true}}
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์, setter์ getter๋ก ์ ์ํ ์ ๊ทผ์ ํ๋กํผํฐ๋ ์ฝ๊ณ ์ธ ์ ์์ง๋ง ์ค์ ๋ก๋ ์กด์ฌํ์ง ์๋
๊ฐ์์ ํ๋กํผํฐ
๋ผ๋ ์ ์ด๋ค.ํ๋กํผํฐ์ด๊ธฐ์ ์ฌ์ฉ์์๋ ๋ฉ์๋์ ๋ค๋ฅด๊ฒ ์ผ๋ฐ ํ๋กํผํฐ์ฒ๋ผ
obj.propName = 'Minju'
,console.log(obj.propName)
์ ๊ฐ์ ํ์์ผ๋ก ์ฝ๊ณ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ์ค์ ๋ก๋ ์กด์ฌํ์ง ์๋ ๊ฐ์์ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฝ๋์์ ํ์ธํด ๋ณธ ๊ฒ ๊ฐ์ด console์ ๊ฐ์ฒด๋ฅผ ์ฐ์ด๋ณด๋ฉด ์ ๊ทผ์ ํ๋กํผํฐ๋ ์ถ๋ ฅ์ด ๋์ง ์๋ ๊ฒ์ ์ ์ ์๋ค.๋ํ, ์ฝ์์๋ ์ฐํ์ง ์์์ง๋ง, Object.getOwnPropertyDescriptors๋ฅผ ํตํด ํ์ธํด ๋ณด๋ฉด ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ propName์ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๊ฐ ์ฐํ๋ ๊ฒ์ ์ ์ ์๋ค.
์ ๊ทผ์ ํ๋กํผํฐ์ ํ์ฉ
๊ทธ๋์ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ด๋์๋ค๊ฐ ์ธ ์ ์์๊น?
ํ์ฉ์ผ์ด์ค 1. ํ๋กํผํฐ ๊ฐ ํต์ ํ๊ธฐ
์๋ ์ฝ๋์์ ์ฌ์ฉ์๊ฐ user.age์ ์์์ธ ๊ฐ์ ๋ฃ์ง ๋ชปํ๋๋ก ๋ง๋ค์๋ค. ์ค์ ๊ฐ์ ๋ณ๋ ํ๋กํผํฐ
_age
์ ์ ์ฅ๋๋ค.let user = { get age(){ return this._age; }, set age(value){ if(value < 0) { return alert('age cannot be negative'); // ์ฌ์ฉ์๊ฐ user.age = -100 ๊ณผ ๊ฐ์ด ๋ง๋ ์๋๋ ๊ฐ์ ๋ฃ๋ ๊ฒ์ ์ ์ดํ ์ ์๋ค. } this._age = value; } } user.age = 100; console.log(user); // {_age: 100} console.log(user.age); // 100
ํ์ฉ์ผ์ด์ค 2. ๋ณ๊ฒฝ์ฌํญ์ ์์ฝ๊ฒ ๋์ฒํ๊ธฐ (ํธํ์ฑ์ ์ํด ์ฌ์ฉ)
์๋์ ๊ฐ์ด ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ์ฌ์ฉํด์ ์ฌ์ฉ์๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
function User(name, age) { this.name = name; this.age = age; } let minju = new User("Minju", 25); alert( minju.age ); // 25
๊ทธ๋ฐ๋ฐ, ๋์ด๊ฐ ์๋๋ผ ์์ผ์ ๋ฐํํด๋ฌ๋ผ๊ณ ์๊ตฌ์ฌํญ์ด ๋ฐ๋์๋ค๊ณ ํด๋ณด์.
function User(name, birthday) { this.name = name; this.birthday = birthday; } let minju = new User("Minju", new Date(1992, 6, 1)); alert(minju.age); // ์ฌ๊ธฐ๋ ์ ๋ถ ์ค๋ฅ๊ฐ ๋ ๊ฒ์ด๋ค.!!! ๐
์์ฑ์ ํจ์๋ฅผ ์ด๋ ๊ฒ ๋ณ๊ฒฝํ๋ค๋ฉด ๊ธฐ์กด ์ฝ๋ ์ค, age๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ฐพ์ ์์ ํด์ค์ผ ํ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์ผ์ผ์ด ์ฐพ์์ ์์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ธด ํ์ง๋ง ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค. ๋ํ ์ฌ๋ฌ ์ฌ๋์ด ์ฌ์ฉ์ค์ด๋ผ๋ฉด ์ธ์ ๋ชจ๋ ์ฐพ์์ ๋ฐ๊ฟ์ด์ฃผ๋....@.@
์ด๋ด ๋, ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด ์ค ์ ์๋ค.
function User(name, birthday) { this.name = name; this.birthday = birthday; // age ํ๋กํผํฐ๋ฅผ ์ ๊ทผ์ ํ๋กํผํฐ๋ก ์์ฑ Object.defineProperty(this, "age", { get() { let todayYear = new Date().getFullYear(); return todayYear - this.birthday.getFullYear(); } }); } let minju = new User("Minju", new Date(1992, 6, 1)); alert( minju.birthday ); // birthday๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. alert( minju.age ); // age ์ญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ฉ์ผ์ด์ค 3. ๋ณ๊ฒฝ์ฌํญ์ ์์ฝ๊ฒ ๋์ฒํ๊ธฐ 2(ํธํ์ฑ์ ์ํด ์ฌ์ฉ)
๋ฐ๋ก ์ ๊ณผ ๋น์ทํ ๋ด์ฉ์ผ๋ก, ์๋ฒ์์ ์ด๋ฆ๊ณผ ์ฑ์ ๋ฐ์ ์ค์ ํ๋ฉด์์๋ fullName์ ๋ฆฌํดํด์ค์ผ ํ๋ค๊ณ ํด๋ณด์.
let user = { firstName: "๋ฏผ์ฃผ", lastName: "๊น", };
ํ๋ฉด์ ์ด๋ฆ์ ๋ณด์ฌ์ฃผ๋ ๊ณณ์์๋ ์๋ง ๋ค์๊ณผ ๊ฐ์ด ๋ณ์๋ฅผ ์์ฑํ๊ณ ์ํ๋ ํ๋ค์์ ๋ฐํํ์ฌ ์ฌ์ฉํ์ ๊ฒ์ด๋ค.
const fullName = `${user.firstName} ${user.lastName}`;
๊ทธ๋ฐ๋ฐ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋์ด ๋ง์ฝ ์ด๋ฆ์ ์ ๋ถ 'ํ์๋'์ ๋ถ์ฌ์ผ ํ๋ค๊ณ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด ๋ณ์ fullName์ด ์๋ ๊ณณ์ ์ ๋ถ ์ฐพ์ ์ผ์ผ์ด ๋ณ๊ฒฝํด์ค์ผ ํ ๊ฒ์ด๋ค. ์ด ๋, ๊ฐ์ฒด ์์์ getter๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ผ๋ฉด ์ด ๋ณ๊ฒฝ์ฌํญ์ ์ฝ๊ฒ ๋์ฒํ ์ ์๋ค! ์๋์ฒ๋ผ ํ๊ตฐ๋ฐ๋ง ๊ฐํธํ๊ฒ ๋ณ๊ฒฝํด ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค!
let user = { firstName: "๋ฏผ์ฃผ", lastName: "๊น", get fullName() { return `${user.firstName} ${user.lastName} ํ์๋` } }; user.fullName
์ฐธ๊ณ
- ์๋ฐ์คํฌ๋ฆฝํธ DeepDive
- https://ko.javascript.info/property-accessors
- ๋๋ฆผ์ฝ๋ฉ ์๋ฆฌ ์๋ฐ์คํฌ๋ฆฝํธ 6. ํด๋์ค์ ์ค๋ธ์ ํธ ์ฐจ์ด์