๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JS

[JavaScript ๋ฌธ๋ฒ•] : 'Class' ์™€ 'setter', 'getter' ์‚ฌ์šฉ ๋ฐ ์˜ค๋ฅ˜ํ•ด๊ฒฐ

by ๊ถŒ์Šพํ–„ 2023. 5. 25.

 

์˜ค๋Š˜์˜ ์ฃผ์ œ

 

class

getter


setter

 

์‹œ์ž‘ !

class๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ Instance๋ฅผ ์ƒ์„ฑํ•ด๋‚ด๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ์ง„. (๊ตฌ๊ธ€ ์ด๋ฏธ์ง€์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.)


๊ตฌ๊ธ€๋งํ•ด์„œ ๊ฐ€์ ธ์˜จ ์ž์ „๊ฑฐ ์‚ฌ์ง„์„ ์˜ˆ์‹œ๋กœ, Class ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์ž์ „๊ฑฐ๋ผ๋Š” Instance(= ๊ฒฐ๊ณผ๋ฌผ)๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

โ€‹

* Class๋ž€? : ํ•˜๋‚˜์˜ ์ž์ „๊ฑฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ '์„ค๊ณ„๋„'.

โ€‹

์ž์ „๊ฑฐ ์„ค๊ณ„๋„๋ฅผ ๋„๋ฉด์ด๋ผ๋Š” '์ข…์ด'์— ๊ทธ๋ฆฐ๋‹ค๋ฉด?

ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” 'constructor'๋ผ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๊ฐ’๋“ค์„ ์ถ”๊ฐ€ํ•ด๊ฐ€๋ฉด์„œ ๋งŒ๋“ฆ !

์„ค๊ณ„๋„์˜ '์ข…์ด' = Constructor (= ์ƒ์„ฑ์ž ํ•จ์ˆ˜)

์ด์ œ ๊ทธ๋Ÿผ constructor๋กœ ์ž์ „๊ฑฐ๋ฅผ ๋งŒ๋“ค์ž.


1. Class๋กœ ๋ญ˜ ๋งŒ๋“ค์ง€ ์ง€์ •ํ•œ๋‹ค.

class Bicycle {}

๋‚œ ์ž์ „๊ฑฐ๋‹ˆ๊นŒ Bicycle !!


2. {}์•ˆ์— ์ด ์ž์ „๊ฑฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„์˜ '์ข…์ด'์—ญํ•  constructor(= ์ƒ์„ฑ์ž ํ•จ์ˆ˜) ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

 

class Bicycle {
    constructor () {
        
    }
}

์ด๋Ÿฌ๋ฉด ์ค€๋น„ ๋.


3. * ํ•„์ˆ˜์š”์†Œ(= Property)

์ด์ œ ๋‚˜๋Š” ์ž์ „๊ฑฐ๋ฅผ ๋งŒ๋“ค์ค€๋น„๊ฐ€ ๋๋‚ฌ๋Š”๋ฐ ์ž์ „๊ฑฐ์— ๋ญ๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ํ•„์š”ํ•œ์ง€, 'ํ•„์ˆ˜์š”์†Œ'๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž !!

์ผ๋‹จ, ๊ตด๋Ÿฌ๊ฐˆ๋ ค๋ฉด '๋ฐ”ํ€ด'์™€ 'ํŽ˜๋‹ฌ' ๊ทธ๋ฆฌ๊ณ , ์›€์ง์ž„์„ ์กฐ์ข…ํ•˜๋ ค๋ฉด 'ํ•ธ๋“ค' ์ด๋‹ˆ๊นŒ, ์ผ๋‹จ ์ด ์ •๋„๋กœ๋งŒ ๋งŒ๋“ค์–ด๋ณด์ž

1.๋ฐ”ํ€ด / 2.ํŽ˜๋‹ฌ / 3.ํ•ธ๋“ค

class Bicycle {
    constructor (tire, pedal, handle) {
        
    }
}

์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ํ•„์ˆ˜์š”์†Œ๋Š” ๋ณด๊ธฐ์™€ ๊ฐ™์ด ()์•ˆ์— ,๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌ๋ถ„ํ•ด์„œ ๋„ฃ์–ด์ค€๋‹ค.

class Bicycle {
  constructor(tire, pedal, handle) {
    this.tire = tire;
    this.pedal = pedal;
    this.handle = handle;
  }
}

๊ทธ๋ฆฌ๊ณ  ๋“ค์–ด์˜ค๋Š” ํ•„์ˆ˜์š”์†Œ๋“ค์„ ๊ฐ์ž ๋‹ค๋ฅธ ์ž์ „๊ฑฐ์— ๋งž๊ฒŒ ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•ด

'this' ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌ๋ถ„์„ ํ•ด์ค€๋‹ค.

์ด๋Ÿฌ๋ฉด ํ•„์ˆ˜์š”์†Œ ๋.


* this๋ฅผ ๋‹ฌ์•„์ฃผ๋Š” ์ด์œ  : this๋Š” j.s(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)์•ˆ์—์„œ ๊ต‰~~์žฅํžˆ ๋‹ค์–‘ํ•œ ์˜๋ฏธ์™€ ์šฉ๋„๋กœ ํ™œ์šฉ๋˜๋Š”๊ฒƒ ๊ฐ™๋‹ค.

๋‚˜๋„ ์•„์ง ๋ชจ๋“  ๋‚ด์šฉ์„ ์•Œ๊ณ ์žˆ์ง„ ๋ชปํ•˜์ง€๋งŒ,

์—ฌ๊ธฐ์„œ์˜ this๋Š” ์•ž์— Bicycle์ด๋ผ๋Š” Instance(๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด๋‚ผ ๊ฒฐ๊ณผ๋ฌผ)์„ ์ง€์นญํ•œ๋‹ค.

class Bicycle {
  constructor(tire, pedal, handle) {
    this.tire = tire;
    this.pedal = pedal;
    this.handle = handle;
  }
}

let greenBicycle = new Bicycle("๊ธˆํ˜ธํƒ€์ด์–ด", "ํ™ฉ๊ธˆ๋น›ํŽ˜๋‹ฌ", "๊ฐ€๋ฒผ์šดํ•ธ๋“ค");
let redBicycle = new Bicycle("๋ฏธ์‰˜๋ฆฐํƒ€์ด์–ด", "๊ฒ์Ÿ์ดํŽ˜๋‹ฌ", "๋Ÿฌ๋ธŒํ•ธ๋“ค");
let blueBicycle = new Bicycle("ํ•œ๊ตญํƒ€์ด์–ด", "๋‹ฌํŒฝ์ดํŽ˜๋‹ฌ", "ํŒŒ์šธํ•ธ๋“ค");

console.log("์ด๊ฑด ์ดˆ๋ก ์ž์ „๊ฑฐ -> ", greenBicycle);
console.log("์ด๊ฑด ๋นจ๊ฐ„ ์ž์ „๊ฑฐ -> ", redBicycle);
console.log("์ด๊ฑด ํŒŒ๋ž€ ์ž์ „๊ฑฐ -> ", blueBicycle);

* this ์„ค๋ช… :

์ดˆ๋ก ์ž์ „๊ฑฐ๋ฅผ ๋ณด์ž,

"๊ธˆํ˜ธํƒ€์ด์–ด" ๋ผ๋Š” ์ดˆ๋ก์ž์ „๊ฑฐ์˜ ํ•„์ˆ˜์š”์†Œ๋Š”,

์œ„ ์ฝ”๋“œ์˜ 'tire' ๋ถ€๋ถ„์— ๋“ค์–ด๊ฐ€์„œ,

this.tire๋กœ ์ง€์ •๋˜๊ณ ,

this๋Š” ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ๋งŒ๋“ค ๊ฒฐ๊ณผ๋ฌผ์ธ Instance๋ฅผ ์ง€์นญํ•˜๊ณ  ์žˆ์œผ๋‹ˆ !!

์ €๊ฑด Class๋ผ๋Š” ์„ค๊ณ„๋„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ (=new Bicycle) ์ดˆ๋ก ์ž์ „๊ฑฐ์˜ tire๋‹ค.

โ€‹

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฏธ์‰˜๋ฆฐ์€ ๋˜ ๋‹ค๋ฅธ new Bicycle tire๊ฐ€ ๋˜๊ณ ,

ํ•œ๊ตญํƒ€์ด์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.

โ€‹

์ด๋ ‡๊ฒŒ this๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€๊ธˆ ๋“ค์–ด์˜จ ํƒ€์ด์–ด๊ฐ€ ์–ด๋–ค ๋Œ€์ƒ์˜ ํƒ€์ด์–ด์ธ์ง€ ์ง€์นญ์„ ํ•ด์ฃผ์–ด์•ผ,

์„œ๋กœ ๋‹ค๋ฅธ ํ•„์ˆ˜์š”์†Œ๋“ค์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


์ด๋ ‡๊ฒŒ console.log()๋กœ ๊ฐ๊ฐ์˜ ์ž์ „๊ฑฐ๊ฐ€ ์ž˜ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ์ฐ์–ด๋ณด๋ฉด,

์„œ๋กœ์˜ ์ž์ „๊ฑฐ๊ฐ€ ๊ฐ์ž์˜ ํ•„์ˆ˜์š”์†Œ๋“ค๋กœ ์ž˜ ๋งŒ๋“ค์–ด์ง„๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


4. ๋ฉ”์„œ๋“œ (= method)

๊ทธ๋ฆผ์— ๋ณด๋ฉด ๋ฉ”์„œ๋“œ์— start() , break() , stop()์ด ์žˆ๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ break ๊ธฐ๋Šฅ์ด ์ œ์ผ ์‹œ๊ธ‰ํ•ด ๋ณด์ด๋‹ˆ ์ž์ „๊ฑฐ์— break๋ฅผ ๋‹ฌ์•„์ฃผ๊ฒ ๋‹ค.

class Bicycle {
  constructor(tire, pedal, handle) {
    this.tire = tire;
    this.pedal = pedal;
    this.handle = handle;
  }

  break() {
    console.log("์†๋„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.");
  }
}

break() ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์šฐ๋ฆฌ์˜ ์„ค๊ณ„๋„ class ์•ˆ์— ๋„ฃ์–ด์ฃผ๋ฉด์„œ, ์ž์ „๊ฑฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด ์ž๋™์œผ๋กœ ๊ทธ ์ž์ „๊ฑฐ๋Š”

break() ๋ฉ”์„œ๋“œ ๋ผ๋Š” ์†์„ฑ์„ ๊ฐ–๊ณ  ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์ด๋‹ค.


๋ธŒ๋ ˆ์ดํฌ ๊ธฐ๋Šฅ์ด ์ž˜ ๋งŒ๋“ค์–ด ์กŒ๋Š”์ง€ break๋ฅผ ์‹คํ–‰(= () )์‹œ์ผœ์„œ ํ™•์ธํ•ด๋ณด์ž.

class Bicycle {
  constructor(tire, pedal, handle) {
    this.tire = tire;
    this.pedal = pedal;
    this.handle = handle;
  }

  break() {
    console.log("์†๋„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.");
  }
}

let greenBicycle = new Bicycle("๊ธˆํ˜ธํƒ€์ด์–ด", "ํ™ฉ๊ธˆ๋น›ํŽ˜๋‹ฌ", "๊ฐ€๋ฒผ์šดํ•ธ๋“ค");
let redBicycle = new Bicycle("๋ฏธ์‰˜๋ฆฐํƒ€์ด์–ด", "๊ฒ์Ÿ์ดํŽ˜๋‹ฌ", "๋Ÿฌ๋ธŒํ•ธ๋“ค");
let blueBicycle = new Bicycle("ํ•œ๊ตญํƒ€์ด์–ด", "๋‹ฌํŒฝ์ดํŽ˜๋‹ฌ", "ํŒŒ์šธํ•ธ๋“ค");

// console.log("์ด๊ฑด ์ดˆ๋ก ์ž์ „๊ฑฐ -> ", greenBicycle);
// console.log("์ด๊ฑด ๋นจ๊ฐ„ ์ž์ „๊ฑฐ -> ", redBicycle);
// console.log("์ด๊ฑด ํŒŒ๋ž€ ์ž์ „๊ฑฐ -> ", blueBicycle);

greenBicycle.break();

์ž˜ ๋งŒ๋“ค์–ด ์กŒ๋‹ค๋ฉด, "์†๋„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ์ด ๋  ๊ฒƒ์ด๋‹ค.

์ž˜ ์‹คํ–‰์ด ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.


this๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋Ÿฐ๊ฒƒ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€‹

break๊ฐ€ ์‹คํ–‰ = () ๋  ๋•Œ์˜ ๋‚ด์šฉ์„ ์ž์ „๊ฑฐ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด,

  break() {
    console.log(this.pedal + " ๋‚˜๊ฐ€์‹ ๋‹ค !! ๊ธธ์„ ๋น„์ผœ๋ผ !!");
  }

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค๋ฉด, ๊ฐ์ž์˜ ํŽ˜๋‹ฌ์ด๋ฆ„์„ ์™ธ์น˜๋ฉด์„œ ๋’ค์— ๋ฌธ์ž์—ด๊ณผ ํ•จ๊ป˜ ์ถœ๋ ฅ์ด ๋  ๊ฒƒ์ด๋‹ค.

class Bicycle {
  constructor(tire, pedal, handle) {
    this.tire = tire;
    this.pedal = pedal;
    this.handle = handle;
  }

  break() {
    console.log(this.pedal + " ๋‚˜๊ฐ€์‹ ๋‹ค !! ๊ธธ์„ ๋น„์ผœ๋ผ !!");
  }
}

let greenBicycle = new Bicycle("๊ธˆํ˜ธํƒ€์ด์–ด", "ํ™ฉ๊ธˆ๋น›ํŽ˜๋‹ฌ", "๊ฐ€๋ฒผ์šดํ•ธ๋“ค");
let redBicycle = new Bicycle("๋ฏธ์‰˜๋ฆฐํƒ€์ด์–ด", "๊ฒ์Ÿ์ดํŽ˜๋‹ฌ", "๋Ÿฌ๋ธŒํ•ธ๋“ค");
let blueBicycle = new Bicycle("ํ•œ๊ตญํƒ€์ด์–ด", "๋‹ฌํŒฝ์ดํŽ˜๋‹ฌ", "ํŒŒ์šธํ•ธ๋“ค");

// console.log("์ด๊ฑด ์ดˆ๋ก ์ž์ „๊ฑฐ -> ", greenBicycle);
// console.log("์ด๊ฑด ๋นจ๊ฐ„ ์ž์ „๊ฑฐ -> ", redBicycle);
// console.log("์ด๊ฑด ํŒŒ๋ž€ ์ž์ „๊ฑฐ -> ", blueBicycle);

greenBicycle.break();
redBicycle.break();
blueBicycle.break();

์ด๋Ÿฐ์‹์œผ๋กœ ๋ง์ด๋‹ค.


* (``)๋ฐฑํ‹ฑ์„ ์ด์šฉํ•˜๋Š” ๋ฒ•

break ๋ฉ”์„œ๋“œ์˜ ์ฝ”๋“œ๋ฅผ ``์„ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅด๊ฒŒ ๋ฐ”๊ฟ”๋ณธ๋‹ค.

  break() {
    console.log(`${this.pedal} ์œผ๋ผ๋ผ๋ž„ 112351 +_+)#$%+#$35`);
  }

์ด๋Ÿฐ์‹์œผ๋กœ ``์„ ์ด์šฉํ•˜๋ฉด ์•ˆ์— ์™ ๋งŒํ•œ ๋ชจ๋“  ๋‚ด์šฉ๋“ค์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

* ๊ทธ๋ฆฌ๊ณ  `` ์•ˆ์—์„œ ๋Œ€์ƒ์„ ์ง€์นญํ• ๋•Œ๋Š” ${}๋ฅผ ์จ์ฃผ๊ณ  ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ง€์นญํ•  ๋Œ€์ƒ์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.


์ถ”๊ฐ€ ์ฝ”๋“œ ํ•ด์„

let greenBicycle = new Bicycle("๊ธˆํ˜ธํƒ€์ด์–ด", "ํ™ฉ๊ธˆ๋น›ํŽ˜๋‹ฌ", "๊ฐ€๋ฒผ์šดํ•ธ๋“ค");

์œ„ greenBicycle์„ ํ•ด์„ํ•˜๋ฉด, class Bicycle์ด๋ผ๋Š” '์„ค๊ณ„๋„' ์— ๊ทผ๊ฑฐํ•ด์„œ,

ํƒ€์ด์–ด๋Š” ๊ธˆํ˜ธํƒ€์ด์–ด๊ณ , ํŽ˜๋‹ฌ์€ ํ™ฉ๊ธˆ๋น›ํŽ˜๋‹ฌ์ด๊ณ , ํ•ธ๋“ค์€ ๊ฐ€๋ฒผ์šด ํ•ธ๋“ค์ธ~

์ƒˆ๋กœ์šด ์ž์ „๊ฑฐ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ค˜ !! ๋ผ๋Š” ๋œป์œผ๋กœ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


getter ์™€ setter

โ€‹

์ด getter ์™€ setter ๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋Š” ์ด์œ !

โ€‹

1. ์šฐ๋ฆฌ๊ฐ€ class๋ผ๋Š” ์„ค๊ณ„๋„๋ฅผ ํ†ตํ•ด์„œ ๊ฒฐ๊ณผ๋ฌผ (= instance)๋ฅผ ๋งŒ๋“ ๋‹ค.

2. ๊ทธ ์•ˆ์—๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์š”์†Œ๋“ค (= Properties) ์ด ์žˆ๋‹ค.

3. ํ•˜์ง€๋งŒ, ๊ทธ ํ•„์ˆ˜์š”์†Œ๋“ค์˜ ๊ฐ’์ด ์˜ณ์ง€ ๋ชปํ•œ ์š”์†Œ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋ฉด ??

4. ์šฐ๋ฆฌ๋Š” ๊ทธ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ณ  ๊ฒ€์ฆ์„ ํ•ด ์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Ex) pedal์ด๋ผ๋Š” ํ•„์ˆ˜์š”์†Œ์— ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์ค€๋‹ค๋˜์ง€, handle์—๋Š” ๊ฐ’์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๋˜์ง€ ๋“ฑ๋“ฑ

โ€‹

๊ทธ๋ž˜์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ธ 'getter'์™€,

๊ฐ’์„ ์„ธํŒ…ํ•ด์ฃผ๋Š” 'setter'๊ฐ€ ์žˆ๋‹ค !

โ€‹

์„ธํŒ…์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์ค€๋‹ค.

class Bicycle {
  constructor(tire, pedal, handle) {
    this._tire = tire;
    this._pedal = pedal;
    this._handle = handle;
  }

  get tire() {
    return this._tire;
  }

  set tire(value) {
    if (typeof value === "number") {
      console.log(`๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” !`);
      return;
    } else if (value.length <= 1) {
      console.log(`์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” !`);
      return;
    }
    this._tire = value;
  }
}


let redBicycle = new Bicycle("๋ฏธ์‰˜๋ฆฐํƒ€์ด์–ด", "๊ฒ์Ÿ์ดํŽ˜๋‹ฌ", "๋Ÿฌ๋ธŒํ•ธ๋“ค");


console.log("์ด๊ฑด ์ดˆ๋ก ์ž์ „๊ฑฐ -> ", redBicycle);
redBicycle.tire = 5;
console.log("์ด๊ฑด ์ดˆ๋ก ์ž์ „๊ฑฐ -> ", redBicycle);

get์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์นœ๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ return๋ฌธ์ด ๋“ค์–ด๊ฐ„๋‹ค !!

set์€ ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์˜ ๊ฒ€์ฆ์„ ํ•„์š”๋กœ ํ•  ๋•Œ, ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

โ€‹

set์€ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ด value๊ธฐ ๋•Œ๋ฌธ์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž๋ฆฌ์— ํ†ต์ƒ์ ์œผ๋กœ value๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

์œ„ ํ•จ์ˆ˜์˜ set ๋ถ€๋ถ„์„ ํ•ด์„ํ•ด๋ณด์ž๋ฉด

๋“ค์–ด์˜จ value์˜ type์ด number ๋ผ๋ฉด '๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”'๋ฅผ ์ฐ๊ณ  return์‹œํ‚จ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ๊ฐ์˜ ํ•„์ˆ˜์š”์†Œ์— ๋“ค์–ด์˜ค๋Š” ๊ฐ’์˜ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ setter์— ๊ฑธ๋ ค์„œ ๊ฐ’์ด ๋‹ค์‹œ return ๋˜์–ด ์ถœ๋ ฅ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


RangeError: Maximum call stack size exceeded => ์˜ค๋Š˜์˜ ์˜ค๋ฅ˜ !!!!

PC@DESKTOP-TI9SBJL MINGW64 ~/Desktop/sparta/Week_5
$ node 06.js
C:\Users\PC\Desktop\sparta\Week_5\06.js:20
    this.tire = value;
              ^

RangeError: Maximum call stack size exceeded
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m
    at set tire [as tire] ?[90m(C:\Users\PC\Desktop\sparta\Week_5\?[39m06.js:20:15?[90m)?[39m

Node.js v18.16.0

getter ์™€ setter๋ฅผ ์“ธ ๋•Œ, ํ•ญ์ƒ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ์ด ์˜ค๋ฅ˜์ด๋‹ค.


์˜ค๋ฅ˜ ๋ฐœ์ƒ์ง€์  : 06.js ํŒŒ์ผ์˜ 20๋ฒˆ ์งธ ์ค„

โ€‹

์˜ค๋ฅ˜ ๋ฌธ๊ตฌ : this.tire = value;


์ž˜๋ชป๋œ ์ ์ด ๋ญ˜๊นŒ ?

โ€‹

RangeError: Maximum call stack size exceeded ์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด์„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฝœ์Šคํƒ์— ์Œ“์ผ ์ˆ˜ ์žˆ๋Š”, ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ด์ฆˆ, ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ–ˆ๋‹ค. ๊ธฐ์ค€์น˜์˜ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ–ˆ๋‹ค.

ํ•œ ๋งˆ๋””๋กœ '๋ฌดํ•œ๋ฃจํ”„'์— ๋น ์กŒ๋‹ค๊ณ  ์ •์˜ํ•œ๋‹ค.

โ€‹

์œ„ ์˜ค๋ฅ˜ ๋‚˜์˜ค๋ฉด === ๋ฌดํ•œ๋ฃจํ”„


๊ทธ๋Ÿผ ์ด์œ ๋Š” ?

  set tire(value) {
    if (typeof value === "number") {
      console.log(`๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” !`);
      return;
    } else if (value.length <= 1) {
      console.log(`์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” !`);
      return;
    }
    this.tire = value;
  }

// ์šฐ๋ฆฌ๊ฐ€ Class Bicycle๋กœ ์ƒˆ๋กœ์šด ์ž์ „๊ฑฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ

// let redBicycle = new Bicycle("๋ฏธ์‰˜๋ฆฐํƒ€์ด์–ด", "๊ฒ์Ÿ์ดํŽ˜๋‹ฌ", "๋Ÿฌ๋ธŒํ•ธ๋“ค");
// ์ด๋ ‡๊ฒŒ ๊ฐ๊ฐ์˜ tire, pedal, handle์— ๊ฐ’์„ ๋ถ€์—ฌํ•˜๊ณ ,

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ธ constructor์— ํ•ด๋‹น ์š”์†Œ์˜ ๊ฐ’๋“ค์„ ๋„ฃ์–ด์ฃผ๊ธฐ ์ „์—~
// setter ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ??

// ์œ„์— ๋ณด์ด๋Š” ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€์„œ ๊ฒ€์ฆ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.
// ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ด number ํ˜•ํƒœ๋Š” ์•„๋‹Œ์ง€ ~ ๋“ค์–ด์˜จ value์˜ ๋ฌธ์ž๊ธธ์ด๊ฐ€ 1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์ง„ ์•Š์€์ง€
// ๊ฒ€์ฆ์„ ๊ฑฐ์น˜๊ณ  ๋“ค์–ด์˜จ value๊ฐ€ ์ •์ƒ์ด๋ผ๋ฉด, ์ •์ƒ์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ this.tire = value;(= ๊ฒ€์ฆ์„ ๋งˆ์นœ ๊ฐ’) ์ •์˜ํ•ด ์ฃผ๋Š”๋ฐ,
// ์ด๋ ‡๊ฒŒ ์ง€์ •์ด ๋˜๋ฉด ์šฐ๋ฆฌ์˜ this๋Š” instance์ธ new Bicycle์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์—,
// ๋˜ ๋‹ค์‹œ ์ž…๋ ฅ๋œ tire๊ฐ’์˜ ๊ฒ€์ฆ์„ ๊ฑฐ์น˜๋Ÿฌ ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค.

// ๊ทธ๋ ‡๊ฒŒ 1๋ฒˆ,2๋ฒˆ,3๋ฒˆ,4๋ฒˆ .......... n๋ฒˆ '๋ฌดํ•œ๋ฃจํ”„'์— ๋น ์ง€๊ฒŒ ๋˜๊ณ ,
// ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— call stack ์—๋Š” ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ •๋ณด๋“ค์ด ๊ณ„์†ํ•ด์„œ ์Œ“์ด๊ฒŒ ๋˜๋ฉด์„œ
// ์ตœ๋Œ€์น˜, ํ•œ๊ณ„ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

// ๊ทธ๋Ÿฌ๋ฉด์„œ ๋‚˜์˜ค๊ฒŒ ๋œ Error ๋ฉ”์‹œ์ง€๊ฐ€ 
RangeError: Maximum call stack size exceeded
// ์ด๋‹ค.

RangeError: Maximum call stack size exceeded ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

โ€‹

this์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  property(= ํ•„์ˆ˜์š”์†Œ)์˜ ์ด๋ฆ„์•ž์—๋Š” ํ•ญ์ƒ _(์–ธ๋”์Šค์ฝ”์–ด)๋ฅผ ๋ถ™์ธ๋‹ค.

โ€‹

์ด์œ  :

โ€‹

_(์–ธ๋”์Šค์ฝ”์–ด) ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์„ธ๊ณ„์—์„œ private๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋งŽ์ด ๊ฐ€์ง„๋‹ค๊ณ  ํ•œ๋‹ค.

๋œป์€ ์€๋ฐ€ํ•˜๊ณ , ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ ์ถœ ๋•Œ~! ๊ทธ๋Ÿด ๋•Œ _๋ฅผ ํ†ตํ•ด์„œ ๋ถ„๋ฆฌ๋ฅผ ์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋‹ค.

โ€‹

this๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ๋งŒ๋“ค instance ๋‚ด์—์„œ๋งŒ ์˜๋ฏธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ _(์–ธ๋”์Šค์ฝ”์–ด)๋ฅผ ํ†ตํ•ด์„œ ๋ถ„๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์•ผ ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ์ด ๋œ๋‹ค.

(this ์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  properties ์•ž์—๋Š” ์ „๋ถ€ _๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.)


์˜ค๋Š˜์˜ ์™„์„ฑ ์ฝ”๋“œ.

class Bicycle {
  constructor(tire, pedal, handle) {
    this._tire = tire;
    this._pedal = pedal;
    this._handle = handle;
  }

  get tire() {
    return this._tire;
  }

  set tire(value) {
    if (typeof value === "number") {
      console.log(`๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” !`);
      return;
    } else if (value.length <= 1) {
      console.log(`์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” !`);
      return;
    }
    this._tire = value;
  }

  break() {
    console.log(`${this.pedal} ์œผ๋ผ๋ผ๋ž„ 112351 +_+)#$%+#$35`);
  }

  //   break() {
  //     console.log(this.pedal + " ๋‚˜๊ฐ€์‹ ๋‹ค !! ๊ธธ์„ ๋น„์ผœ๋ผ !!");
  //   }
}

let greenBicycle = new Bicycle("๊ธˆํ˜ธํƒ€์ด์–ด", "ํ™ฉ๊ธˆ๋น›ํŽ˜๋‹ฌ", "๊ฐ€๋ฒผ์šดํ•ธ๋“ค");
let redBicycle = new Bicycle("๋ฏธ์‰˜๋ฆฐํƒ€์ด์–ด", "๊ฒ์Ÿ์ดํŽ˜๋‹ฌ", "๋Ÿฌ๋ธŒํ•ธ๋“ค");
let blueBicycle = new Bicycle("ํ•œ๊ตญํƒ€์ด์–ด", "๋‹ฌํŒฝ์ดํŽ˜๋‹ฌ", "ํŒŒ์šธํ•ธ๋“ค");

console.log("์ด๊ฑด ์ดˆ๋ก ์ž์ „๊ฑฐ -> ", greenBicycle);
console.log("์ด๊ฑด ๋นจ๊ฐ„ ์ž์ „๊ฑฐ -> ", redBicycle);
console.log("์ด๊ฑด ํŒŒ๋ž€ ์ž์ „๊ฑฐ -> ", blueBicycle);

greenBicycle.break();
redBicycle.break();
blueBicycle.break();

redBicycle.tire = "์„ธ์ƒ์€ ํ•˜๋‚˜";
console.log("์ด๊ฑด ๋นจ๊ฐ„ ์ž์ „๊ฑฐ -> ", redBicycle);

์ด๋ ‡๊ฒŒ class์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ทธ ์•ˆ์—์„œ property ์— ์ ‘๊ทผํ•˜๊ณ , ์„ธํŒ…ํ•˜๊ณ , ๊ฒ€์ฆํ•ด์ฃผ๋Š” getter ์™€ setter ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋‹ค.

โ€‹

this๋Š” ์ด ๋ฐ–์—๋„ ๊ต‰์žฅํžˆ ๋งŽ์€ ์—ญํ• ๋“ค์ด ์žˆ์–ด์„œ, ๊ทธ ๋ถ€๋ถ„์„ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํžˆ ํŒŒ๊ณ  ๋“ค์–ด ๋ณด์•„์•ผ ๊ฒ ๊ณ ,

_์–ธ๋”์Šค์ฝ”์–ด๋„ ์ •ํ™•ํžˆ ์–ด๋–ค์‹์œผ๋กœ ๋ถ„๋ฆฌ๋ฅผ ์‹œ์ผœ์ฃผ๋Š” ๊ฑด์ง€ ์›๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ข€ ๋” ํ™•์ธํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.


์‹œ : class๋ฅผ ์‚ฌ์šฉํ•ด ์ž์ „๊ฑฐ ๋งŒ๋“ค๊ธฐ (getter ์™€ setter ์‚ฌ์šฉ).

๋ฌธ : RangeError: Maximum call stack size exceeded

ํ•ด : ์–ธ๋”์Šค์ฝ”์–ด(_)๋ฅผ ์ด์šฉํ•ด property๋ฅผ ๋ถ„๋ฆฌ.

์•Œ : class์˜ ๊ฐœ๋… ๋ฐ ํ๋ฆ„ ์ดํ•ด, ๋ฌดํ•œ๋ฃจํ”„, getter setter, ์–ธ๋”์Šค์ฝ”์–ด์˜ ๊ธฐ๋Šฅ, this ์™€์˜ ์นœ๋ฐ€๊ฐ ์ƒ์Šน

        ``(๋ฐฑํ‹ฑ)์˜ ์ž์œ ๋กœ์šด ํ™œ์šฉ๋„

 

#์‹œ๋ฌธํ•ด์•Œ #javascript #class #getter #setter #`` #๋ฐฑํ‹ฑ #this #๋ฌดํ•œ๋ฃจํ”„ #RangeError

#Maximum_call_stack_size_exceeded #์˜ค๋ฅ˜ #์˜ค๋ฅ˜ํ•ด๊ฒฐ #๋ฌธ๋ฒ•