Getter & Setter

kirin.logยท2021๋…„ 9์›” 21์ผ
1

๐Ÿฆ‹ getter & setter

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' ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
boma91@gmail.com

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