TIL_28_with Wecode 018 JavaScript about Class

JIEUNยท2021๋…„ 2์›” 23์ผ
0
post-thumbnail

๐Ÿฆจ class
ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€, ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์ฒด๋“ค๋กœ ๊ตฌ์„ฑํ•˜๊ณ ,
๊ฐ์ฒด๋“ค ๊ฐ„์— ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
ํด๋ž˜์Šค๋Š” { num: 1 } ์ฒ˜๋Ÿผ ์ƒ๊ธด ๊ฐ์ฒด(object)๋ฅผ ์ž˜ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•œ ํ‹€์€ ๋งž์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด ๋•Œ์˜ ๊ฐ์ฒด๋Š” ํŠน์ •๋กœ์ง์„ ๊ฐ–๊ณ  ์žˆ๋Š” ํ–‰๋™(method)์™€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(๋ฉค๋ฒ„ ๋ณ€์ˆ˜)๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
์›ํ•˜๋Š” ๊ตฌ์กฐ์˜ ๊ฐ์ฒด ํ‹€์„ ์งœ๋†“๊ณ , ๋น„์Šทํ•œ ๋ชจ์–‘์˜ ๊ฐ์ฒด๋ฅผ ๊ณต์žฅ์ฒ˜๋Ÿผ ์ฐ์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด๋„ ์ข‹์ง€๋งŒ,
ํฐ ํ๋ชจ์˜ ๊ฐ์ฒด์ด๊ฑฐ๋‚˜ ๋น„์Šทํ•œ ๋ชจ์–‘์˜ ๊ฐ์ฒด๋ฅผ ๊ณ„์† ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋ฉด,
class๋ผ๋Š” ์„ค๊ณ„๋„๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, 'ray' ์ฐจ๋ฅผ ๊ฐ์ฒด๋กœ ์ •์˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ray ๋ผ๋Š” ๊ฐ์ฒด๋Š” 5๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • name
  • price
  • getName
  • getPrice
  • applyDiscount
let ray = {  
  name: 'Ray',
  price: 2000000,   
  getName: function() { 
  // ray ๋ผ๋Š” ๊ฐ์ฒด์˜ getName ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋จ.
    return this.name;  
  },   
  getPrice: function() {  
          // getPrice ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์•ˆ์— ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋จ.
    return this.price;  
  },   
  applyDiscount: function(discount) {
     // applyDiscount ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์•ˆ์— ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋จ.
    return this.price * discount;   
  } 
}

ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์—๋Š” ํ•จ์ˆ˜๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ getPrice๋ผ๋Š” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const rayPriceByFunction = ray.getPrice();
console.log('ํ•จ์ˆ˜๋กœ ์ ‘๊ทผ => ' +rayPriceByFunction);

๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ, ํ•ด๋‹น ๐Ÿง˜โ€โ™‚๏ธ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด "this"๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ getPrice ๋ฉ”์„œ๋“œ์—์„œ this.price๋กœ price ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ ,
2000000 ๊ฐ’์„ ๊ฐ–๊ณ  ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ๋ชจ๋ธ์ด ๋‚˜์™”๋‹ค๋ฉด, ์—ฌ๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์“ธ ํ•„์š”์—†์ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์€ Car๋ผ๋Š” ํด๋ž˜์Šค(class)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Car {
  constructor(name, price) {
    this.name = name;
    this.price = price;
    this.department = "์„ ๋ฆ‰์ง€์ ";
    this.salesAmount = 0;
  }
  applyDiscount(discount) {  
    return this.price * discount;   
  }
  addSales() {
    this.salesAmount++;
  }
}

๐Ÿฆจ ์ƒ์„ฑ์ž(Constructor)
๊ฐ์ฒด(object)์˜ ์„ค๊ณ„๋„์ธ ํด๋ž˜์Šค(class)๋Š” ๋ฌธ๋ฒ•์ด ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
๋‘˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” cunstructor ๋ผ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด class๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ '์ธ์Šคํ„ด์Šคํ™”'๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

const morning = new Car('Morning', 2000000);

class๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
class๋Š” ์ƒˆ๋กœ์šด instance๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค constructor()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

class Car { 
  // Car ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด
  constructor(name, price) {
    this.name = name;
    this.price = price;
  }
}
  • Car๋Š” class์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ณ , CamelCase๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Car class์˜ instance๋ฅผ ์ƒ์„ฑํ• ๋•Œ๋งˆ๋‹ค constructor๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • constructor()๋ฉ”์„œ๋“œ๋Š” name, price 2๊ฐœ์˜ argument(์ธ์ž)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • constructor()๋ฉ”์„œ๋“œ์— this ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. class์˜ ์‹คํ–‰๋ฒ”์œ„(context)์—์„œ this๋Š” ํ•ด๋‹น instance๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • constructor()์—์„œ ์ธ์ž๋กœ ๋„˜์–ด์˜ค๋Š” name๊ณผ price๋ฅผ ์‚ฌ์šฉํ•ด Car instance์˜ name, price ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค ๋‚ด์—์„œ name, price์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ’์ด์ž class๋‚ด์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์–ด๋Š ๊ณณ์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ '๋ฉค๋ฒ„ ๋ณ€์ˆ˜'๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
  • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” 'this' ํ‚ค์›Œ๋“œ๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฆจ ์ธ์Šคํ„ด์Šค(Instance)
์œ„์—์„œ class instance๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์ธ์Šคํ„ด์Šค(Instance)๋Š” class๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
์ธ์Šคํ„ด์Šค๋Š” class์˜ property์ด๋ฆ„๊ณผ method๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
์ธ์Šคํ„ด์Šค ๋งˆ๋‹ค ๋ชจ๋‘ ๋‹ค๋ฅธ property ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

const morning = new Car('Morning', 20000000);
  • ์ธ์Šคํ„ด์Šค๋Š” Class ์ด๋ฆ„์— new๋ฅผ ๋ถ™์—ฌ์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ์ด๋ฆ„ ์šฐ์ธก์— () ๊ด„ํ˜ธ๋ฅผ ์—ด๊ณ  ๋‹ซ๊ณ , ๋‚ด๋ถ€์—๋Š” constructor์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
  • Carํด๋ž˜์Šค์˜ instance๋ฅผ morning์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ํ•œ ๋ฒˆ! Car ํด๋ž˜์Šค์˜ ์ƒˆ๋กœ์šด instance๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด new ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. newํ‚ค์›Œ๋“œ๋Š” constructor() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ƒˆ๋กœ์šด instance๋ฅผ returnํ•ด์ค๋‹ˆ๋‹ค.
  • 'Morning'์ด๋ผ๋Š” String๊ณผ 2000000์ด๋ผ๋Š” Number๋ฅผ Car ์ƒ์„ฑ์ž์— ๋„˜๊ฒจ์ฃผ์—ˆ๊ณ , name, price ํ”„๋กœํผํ‹ฐ์— ๊ฐ์ž์˜ ๊ฐ’์ด ํ• ๋‹น๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ์ƒˆ๋กœ์šด ์ฐจ ๋“ฑ๋กํ•˜๊ธฐ.
const spaceship = new Car('์šฐ์ฃผ์„ ', 25000000);
console.log(spaceship);
console.log(spaceship.name); 
console.log(spaceship.price); 
console.log(spaceship.applyDiscount(0.5)); 

๐Ÿฆจ ๋ฉ”์„œ๋“œ(Methods)
๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๊ฐ์ฒด๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
Class์˜ method๋Š” Object(๊ฐ์ฒด)์˜ ๋ฌธ๋ฒ•๊ณผ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ๋งˆ๋‹ค comma(,)๋กœ ๊ตฌ๋ถ„ํ•ด์ค˜์•ผ ํ–ˆ์ง€๋งŒ, ํด๋ž˜์Šค๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Car ๊ฐ์ฒด์— changeDepartment ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

class Car {
  constructor(name, price) {
    this.name = name;
    this.price = price;
    this.department = "์„ ๋ฆ‰์ง€์ ";
  }
  applyDiscount(discount) {  
    return this.price * discount;   
  }
  changeDepartment(departmentName) {
    this.department = departmentName;
  }
}
const spaceship = new Car('์šฐ์ฃผ์„ ', 25000000);
spaceship;
/*
๊ฒฐ๊ณผ Car {
  name: '์šฐ์ฃผ์„ ',
  price: 25000000,
  department: '์„ ๋ฆ‰์ง€์ ',
  __proto__: Car {
    constructor: ฦ’ Car(),
    applyDiscount: ฦ’ applyDiscount(),
    changeDepartment: ฦ’ changeDepartment()
  }
}
*/
spaceship.name; //์šฐ์ฃผ์„ 
spaceship.price; //25000000

changeDepartment ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด๋ณด๊ณ  ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ department ์ •๋ณด๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

๐Ÿง˜โ€โ™‚๏ธ this?

๐Ÿฆจ Assignment
class ์ƒ์„ฑ์„ ์—ฐ์Šตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • MyMath๋ผ๋Š” class๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”.
  • constructor์—์„œ๋Š” ์ˆซ์ž 2๊ฐœ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ํ”„๋กœํผํ‹ฐ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด 4๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”. getNumber: ๋‘ ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ ex) [1, 2]
    • add: ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • substract: ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋นผ๋Š” ๋ฉ”์„œ๋“œ
    • multiply: ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๊ณฑํ•˜๋Š” ๋ฉ”์„œ๋“œ

๋‹ต๋ณ€:

class MyMath { constructor(number1, number2) {
  this.number1 = number1;
  this.number2 = number2;
}
  getNumber(){
  let arr = [];
  arr.push(this.number1);
  arr.push(this.number2);
    return arr;
}
  add(){
    return this.number1 + this.number2;
}
  substract() {
    return this.number1 - this.number2;
}
  multiply(){
    return this.number1 * this.number2;
 }
}

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

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