[JavaScript] class ๋ช…๋ น

์ˆ˜๋ฏผ๐Ÿฃยท2022๋…„ 1์›” 13์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
13/32

๐Ÿ“” ํด๋ž˜์Šค ์ •์˜ํ•˜๊ธฐ - class ๋ช…๋ น

class ํด๋ž˜์Šค๋ช… {
	์ƒ์„ฑ์ž์˜ ์ •์˜
    ํ”„๋กœํผํ‹ฐ์˜ ์ •์˜
    ๋ฉ”์†Œ๋“œ์˜ ์ •์˜
}                           // class ๋ช…๋ น

๋ฉ”์†Œ๋“œ๋ช…(์ธ์ˆ˜, ...) {
	๋ฉ”์†Œ๋“œ์˜ ๋ณธ์ฒด
}                           // ๋ฉ”์†Œ๋“œ ์ •์˜

constructor() {
	this.ํ”„๋กœํผํ‹ฐ๋ช… = ๊ฐ’
}                           // ์ƒ์„ฑ์ž ์ •์˜
*์˜ˆ์‹œ*

class Member {
    //์ƒ์„ฑ์ž
    constructor(firstName, lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }

    //๋ฉ”์†Œ๋“œ
    getName() {
        return this.lastName + this.firstName;
    }
}
let m = new Member('์‹œ์˜จ', '์ •');
console.log(m.getName()); //๊ฒฐ๊ณผ : ์ •์‹œ์˜จ

๐Ÿ”น this

  • ์ƒ์„ฑ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ์ธ์Šคํ„ด์Šค(์ž๊ธฐ์ž์‹ )์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ
  • this ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”นํด๋ž˜์Šค๋Š” function ์ƒ์„ฑ์ž์™€ ๋‹ค๋ฅด๋‹ค.

  • ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
let m = Member('์‹œ์˜จ', '์ •');//new ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๋‹ค
//๊ฒฐ๊ณผ : Class constructor Member cannot be invoked without 'new'
  • ์ •์˜ํ•˜๊ธฐ ์ „์˜ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
let m = new Member('์‹œ์˜จ', '์ •');
// ๊ฒฐ๊ณผ : Member is not defined
class Member{ ...์ƒ๋žต...}

๐Ÿ”นํ”„๋กœํผํ‹ฐ ์ •์˜ํ•˜๊ธฐ

get ํ”„๋กœํผํ‹ฐ๋ช… {
	๊ฐ’์„ ์ทจ๋“ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ     // ๊ฐ’ return
}

set ํ”„๋กœํผํ‹ฐ๋ช…(value) {
	๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ     // ๊ฐ’ ์„ค์ •
}
class Member {
    //์ƒ์„ฑ์ž
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

    //firstName ํ”„๋กœํผํ‹ฐ
  get firstName() {
    return this._firstName;
  }

  set firstName(value) {
    this._firstName = value;
  }

    //lastName ํ”„๋กœํผํ‹ฐ
  get lastName() {
    return this._lastName;
  }

  set lastName(value) {
    this._lastName = value;
  }

  getName() {
    return this.lastName + this.firstName;
  }
}

let m = new Member('์‹œ์˜จ', '์ •');
console.log(m.getName());//๊ฒฐ๊ณผ : ์ •์‹œ์˜จ


: getter๋ฅผ ์ •์˜ํ•˜๋Š” ์ˆœ๊ฐ„ this.firstName๋Š” getter๋ฅผ ํ˜ธ์ถœ
setter๋ฅผ ์ •์˜ํ•˜๋Š” ์ˆœ๊ฐ„ '= firstName' ๊ฐ’์„ ํ• ๋‹น ํ•  ๋•Œ setter๋ฅผ ํ˜ธ์ถœ
๊ทธ ๋ง์€, ์ „๋‹ฌ ๋œ value๋ฅผ this.firstName์— ํ• ๋‹น ํ•  ๋•Œ ๋‹ค์‹œ setter๋ฅผ ํ˜ธ์ถœ ์ฆ‰, ๋ฌดํ•œ์ • ๋ฐ˜๋ณต = call stack size exceeded ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.
โžก getter์™€ setter์•ˆ์— ๋ณ€์ˆ˜๋ฅผ '_'๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ”น์ •์  ๋ฉ”์†Œ๋“œ ์ •์˜ํ•˜๊ธฐ(static)

  • ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ ์ƒ๊ด€์—†์ด ๊ณตํ†ต์ ์œผ๋กœ class์—์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ
class Area {
  static getTriangle(base, height) {
    return base * height / 2;
  }
}

console.log(Area.getTriangle(10, 5));// ๊ฒฐ๊ณผ : 25

๐Ÿ”น๊ธฐ์กด ํด๋ž˜์Šค ๊ณ„์Šนํ•˜๊ธฐ

  • extends ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ๊ณ„์Šนํ•œ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
class Member {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  getName() {
    return this.lastName + this.firstName;
  }
}
//Member ๊ฐ์ฒด๋ฅผ ๊ณ„์Šนํ•œ BusinessMember ํด๋ž˜์Šค๋ฅผ ์ •์˜
class BusinessMember extends Member {
  work() {
    return this.getName() + '์€ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.';
  }
}

let bm = new BusinessMember('์‹œ์˜จ', '์ •');
console.log(bm.getName());
console.log(bm.work());

๐Ÿ”น๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ / ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜๊ธฐ - super ํ‚ค์›Œ๋“œ

  • ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ/ ์ƒ์„ฑ์ž๋ฅผ ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ = ์˜ค๋ฒ„๋ผ์ด๋“œ
  • ์˜ค๋ฒ„๋ผ์ด๋“œ์‹œ, ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ์žฌ์ž‘์„ฑ ํ•˜๋Š” ๊ฒƒ ๋งŒ์€ ์•„๋‹ˆ๋ฉฐ ์ด์–ด ๋ฐ›์œผ๋ฉฐ ๋‚˜๋จธ์ง€๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ super ํ‚ค์›Œ๋“œ๋ฅผ ์ฐธ์กฐ
super (args, ...)     // ์ƒ์„ฑ์ž
super.method (args, ...)   // ๋ฉ”์†Œ๋“œ
//Member ํด๋ž˜์Šค์— ์ •์˜๋œ ์ƒ์„ฑ์ž/getName ๋ฉ”์†Œ๋“œ๋ฅผ BusinessMember ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๋Š” ์˜ˆ์‹œ
class Member {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  getName() {
    return this.lastName + this.firstName;
  }
}

//Member ๊ฐ์ฒด๋ฅผ ๊ณ„์Šนํ•œ BusinessMember ํด๋ž˜์Šค๋ฅผ ์ •์˜
class BusinessMember extends Member {
    // ์ธ์ˆ˜๋กœ clazz๋ฅผ ์ถ”๊ฐ€
  constructor(firstName, lastName, clazz) {
    super(firstName, lastName);
    this.clazz = clazz;
  }

    // ์ง์ฑ… ํฌํ•จ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •
  getName() {
    return super.getName() + '๏ผ์ง์ฑ…:' + this.clazz;
  }
}

let bm = new BusinessMember('์„ฑ๋ฃก', '๊น€', '๊ณผ์žฅ');
console.log(bm.getName());// ๊ฒฐ๊ณผ : ๊น€์„ฑ๋ฃก / ์ง์ฑ… : ๊ณผ์žฅ```

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

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