getter
๋ ์ ํด๋์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ, setter
๋ ์ ํด๋์ ๊ฐ์ ์๋กญ๊ฒ ๋ค์ ์ค์ ํด์ฃผ๋ ๊ฒ์ ๋ปํ๋ค.
๋ํ ๋ฐ์ดํฐ๋ฅผ ์์ ๋๋ ์ถ๋ ฅํ ๋ ๋ฐ์ดํฐ์ ์๋ณธ์ ๋ณด์กดํ๊ธฐ ์ํด, ์ง์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ง์ง๋๊ฒ ์๋๋ผ ๊ฐ์ ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ํค์๋์ด๋ค.
๊ฐ์ฒด์ ์์ฑ(property)์ ๋ ์ข
๋ฅ๋ก ๋๋ ์ง๋ค.
1) ๋ฐ์ดํฐ ํ๋กํผํฐ(data property)
2) ์ ๊ทผ์ ํ๋กํผํฐ(accessor property)
์ ๊ทผ์ ํ๋กํผํฐ
์ ๋ณธ์ง์ ํจ์์ด๋ค. ์ด ํจ์๋, ๊ฐ์ ํ๋(get)ํ๊ณ ์ค์ (set) ํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
๊ทธ๋ฌ๋ ์ธ๋ถ ์ฝ๋์์๋ ํจ์๊ฐ ์๋ ์ผ๋ฐ์ ์ธ ์์ฑ(property)์ฒ๋ผ ๋ณด์ธ๋ค.
let obj = {
get propName() {
// getter
//obj.propName์ ์คํํ ๋ ์คํ๋๋ ์ฝ๋
},
set propName(value) {
// setter
// obj.propName = value ๋ฅผ ์คํํ ๋ ์คํ๋๋ ์ฝ๋
}
};
getter๋ฉ์๋๋ obj.propName
์ ์ฌ์ฉํด ํ๋กํผํฐ๋ฅผ ์ฝ์ผ๋ ค๊ณ ํ ๋ ์คํ๋๊ณ ,
setter๋ฉ์๋๋ obj.propName = value
์ผ๋ก ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๋ ค ํ ๋ ์คํ๋๋ค.
let user = { name: "may", surname: "Lee" } get fullName() { return `${this.name} ${this.surname}` }; // fullName์ด user์ ์ ๊ทผํ ์ ์๋ค. // getter(์ ๊ทผ์ ํ๋กํผํฐ)๋ฅผ ํ์ฉํ์ฌ ์ ๊ทผํ ์ ์๋ค. alert(user.fullName); // May Lee
๋ฐ๊นฅ ํ๋กํผํฐ์์๋ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ผ๋ฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์์ฒ๋ผ ํธ์ถํ์ง ์๊ณ , ์ผ๋ฐ ํ๋กํผํฐ์์ ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ฒ๋ผ ํ๋ฒํ๊ฒ user.fullName์ ์ฌ์ฉํด ํ๋กํผํฐ ๊ฐ์ ์ป์ ์ ์๋ค.
โ๏ธ fullName์ getter๋ฉ์๋๋ง ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์,user.fullName =
์ ์ฌ์ฉํด์ ๊ฐ์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋๋ค.let user = { get fullName() { return `...`; } }; user.fullName = "Test" // Error (ํ๋กํผํฐ์ getter ๋ฉ์๋๋ง ์๊ธฐ ๋๋ฌธ์ ๊ฐํ ๋นX)
let user = { name: "May", surname: "Lee" } get fullName() { return `${this.name} ${this.surname}`; }, set fullName(value) { [this.name, this.surname] = value.split(" "); }; // ์ฃผ์ด์ง ๊ฐ์ ์ฌ์ฉํด set fullName์ด ์คํ๋๋ค. user.fullName = "Vivian Kong"; alert(user.name); // Vivian alert(user.surname); // Kong
์ด๋ ๊ฒ getter์ setter๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๊ฐ์ฒด์๋ fullName์ด๋ผ๋
๊ฐ์์ ํ๋กํผํฐ
๊ฐ ์๊ธด๋ค.
๊ฐ์์ ํ๋กํผํฐ๋ ์ฝ๊ณ ์ธ ์๋ ์์ง๋ง ์ค์ ๋ก๋ ์กด์ฌํ์ง ์๋๋ค.
get
: ์ธ์๊ฐ ์๋ ํจ์๋ก, ํ๋กํผํฐ๋ฅผ ์ฝ์ ๋ ๋์ํจset
: ์ธ์๊ฐ ํ๋์ธ ํจ์๋ก, ํ๋กํผํฐ์ ๊ฐ์ ์ธ ๋ ํธ์ถ๋จObject.defineProperty(obj, prop, descriptor)
:// Object.defineProperty ์ ์ค๋ช
์ get, set์ ์ ๋ฌํ๋ฉด
// FullName์ ์ํ ์ ๊ทผ์๋ฅผ ๋ง๋ค ์ ์๋ค.
let user = {
name: "May",
surname: "Lee"
};
Object.defineProperty(user, 'fullName', {
get() {
return `${this.name} ${this.surname}`;
},
set(value) {
[this.name, this.surname] = value.split(" ");
}
});
alert(user.fullName); // May Lee
for (let key in user) alert (key); // name, surname
โ๏ธ getter์ setter ํ์ฉํ๊ธฐ
getter์ setter๋ฅผ โ์ค์ โ ํ๋กํผํฐ ๊ฐ์ ๊ฐ์ธ๋ ๋ํผ(wrapper)์ฒ๋ผ ์ฌ์ฉํ๋ฉด, ํ๋กํผํฐ ๊ฐ์ ์ํ๋ ๋๋ก ํต์ ํ ์ ์๋ค.
์๋ ์์์์ name์ ์ํ setter๋ฅผ ๋ง๋ค์ด user์ ์ด๋ฆ์ด ๋๋ฌด ์งง์์ง๋ ๊ฑธ ๋ฐฉ์งํ๊ณ ์๋ค.
์ค์ ๊ฐ์ ๋ณ๋์ ํ๋กํผํฐ _name์ ์ ์ฅ๋๋ค.
let user = { get name() { return this._name; }, set name(value) { if(value.length < 4) { alert("์ ๋ ฅ๊ฐ์ด ์งง๋ค") return; } this._name = value; } }; user.name = "May"; alert(user.name); // May
user์ ์ด๋ฆ์ _name์ ์ ์ฅ๋๊ณ , ํ๋กํผํฐ์ ์ ๊ทผํ๋ ๊ฒ์ getter์ setter๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ค.
๊ธฐ์ ์ ์ผ๋ก๋ ์ธ๋ถ ์ฝ๋์์ user._name์ ์ฌ์ฉํด ์ด๋ฆ์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.๊ทธ๋ฌ๋ ๋ฐ์ค( __ )๋ก ์์ํ๋ ํ๋กํผํฐ๋ ๊ฐ์ฒด ๋ด๋ถ์์๋ง ํ์ฉํ๊ณ ์ธ๋ถ์์๋ ๊ฑด๋๋ฆฌ์ง ์๋ ๊ฒ์ด ๊ด์ต์ด๋ค.
name() ์์ get ํค์๋๋ฅผ ์ ๋ ฅํ๋ฉด getter ํธ์ถ์
name.getter()
๊ฐ ์๋name.getter
๋ก ์๊ดํธ ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ set๋ ๋๊ฐ์ด ์ธ ์ ์์ผ๋ฉฐ, ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ด ๋ฃ๊ธฐ ์ํด์ name.setter = 'may' ์ด๋ฐ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.