# [๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] - ํด๋ž˜์Šค(class) ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
Study Repository

[๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] - ํด๋ž˜์Šค(class) ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

by rlaehddnd0422

[๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ]๋Š” ์•„๋ž˜ ํŠœํ† ๋ฆฌ์–ผ ๊ณผ์ •์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

ํด๋ž˜์Šค

 

ko.javascript.info


1. ํด๋ž˜์Šค์™€ ๊ธฐ๋ณธ๋ฌธ๋ฒ•

JS๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๋™์ผํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ new function์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, JS๋„ ์ž๋ฐ”์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ class๋ผ๋Š” ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ ๋ฌธ๋ฒ•

๊ธฐ๋ณธ๋ฌธ๋ฒ•์€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. 

class MyClass {
    constructor() { ... }
    method() { ... }
}

 

์กฐ๊ธˆ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค๋ฉด, constructor()๋Š” new์— ์˜ํ•ด ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด, ํŠน๋ณ„ํ•œ ์ ˆ์ฐจ์—†์ด ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

class User {
    constructor(name) {
        this.name = name;
    }
 
    sayHi() {
        console.log(this.name);
    }
}

let user = new User('user1');
user.sayHi();

// ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘
function Member(name) {
    this.name = name;

    this.sayHi = function() {
        console.log(this.name);
    };
}

let user2 = new Member("ser2");
user2.sayHi();

 

new User('user1')์„ ํ˜ธ์ถœํ•˜๋ฉด ๋จผ์ € ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜ ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ์ดํ›„ ๋„˜๊ฒจ๋ฐ›์€ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ constructor๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์–ด ๊ฐ์ฒด์˜ name ํ”„๋กœํผํ‹ฐ์— 'user1'์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ๊ณผ์ •์„ ๊ฑฐ์นœ ํ›„์— user.sayHi()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ฃ .

 

๊ทธ๋ž˜์„œ JS์—์„œ ํด๋ž˜์Šค๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด๋ƒ. ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜์˜ ํ•œ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. 

console.log(typeof User); // function

 

์ด์ œ ํ•จ์ˆ˜์˜ ๊ด€์ ์—์„œ class์˜ ๋ฌธ๋ฒ•๊ตฌ์กฐ๊ฐ€ ํ•˜๋Š” ์ผ์„ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

  1. User๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ "ํ•จ์ˆ˜"๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์€ ์ƒ์„ฑ์ž ๋ฉ”์†Œ๋“œ์ธ constructor์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ƒ์„ฑ์ž๊ฐ€ ์—†๋‹ค๋ฉด ๋ณธ๋ฌธ์ด ๋น„์›Œ์ง„์ฑ„๋กœ ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
  2. sayHi ๊ฐ™์ด ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋ฅผ User.prototype์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

prototype ์— ๊ด€ํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„ ์ž์„ธํžˆ ์•Œ์•„๋ณผํ…๋ฐ, ์šฐ์„ ์€ "prototype์€ ๊ฐ์ฒด ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋“ค์ด ๊ณต์œ ํ•˜๋Š” ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ํŠน์ˆ˜ ๊ฐ์ฒด" ์ •๋„๋กœ๋งŒ ๊ธฐ์–ตํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ new User๋ฅผ ํ˜ธ์ถœํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด "ํ•จ์ˆ˜"์˜ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

User.prototype

์ฝ”๋“œ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด ์ด๋ ‡๊ฒ ๋„ค์š”.

class User {
  constructor(name) { this.name = name; }
  sayHi() { alert(this.name); }
}

// ํด๋ž˜์Šค = ํ•จ์ˆ˜
alert(typeof User); // function

// ์ •ํ™•ํžˆ๋Š” ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
alert(User === User.prototype.constructor); // true

// ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋Š” User.prototype์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
alert(User.prototype.sayHi); // alert(this.name);

// ํ˜„์žฌ ํ”„๋กœํ† ํƒ€์ž…์—๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋‘ ๊ฐœ์ž…๋‹ˆ๋‹ค.
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi

 

๊ฒฐ๋ก ์œผ๋กœ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋Š” ํด๋ž˜์Šค๋Š” ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋กœ ์ธํ•ด ํด๋ž˜์Šค๋ฅผ ๋‹จ์ง€ '๊ฐ์ฒด'๋ฅผ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜์˜ "ํŽธ์˜ ๋ฌธ๋ฒ•" ์ •๋„์— ๋ถˆ๊ณผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ์‚ฌ์‹ค ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœ ํŽธ์˜๋ฌธ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค.

 

function์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ class๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์—๋Š” ์ค‘์š”ํ•œ ๋ช‡๊ฐ€์ง€ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋จผ์ € class๋กœ ๋งŒ๋“  ํ•จ์ˆ˜์—๋Š” ํŠน์ˆ˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์ธ IsClassConstructor(true)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ฅผ new์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ด ๋•Œ [[IsClassConstructor]]: true๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ˜•๋ณ€ํ™˜ํ•˜๋ฉด 'class…'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ๋˜๋Š”๋ฐ ์ด๋•Œ๋„ [[IsClassConstructor]]: true๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ํด๋ž˜์Šค์˜ prototype ํ”„๋กœํผํ‹ฐ์— ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ์˜ enumerable ํ”Œ๋ž˜๊ทธ๋Š” false์ด๊ธฐ ๋•Œ๋ฌธ์— class ์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • for..in์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•  ๋•Œ, ๋ฉ”์„œ๋“œ๋Š” ์ˆœํšŒ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ์ด ํŠน์ง•์€ ๊ฝค ์œ ์šฉํ•˜๋‹ค๋Š”๊ฑฐ.

์ด ์™ธ์—๋„ class์™€ function์€ ์ฐจ์ด์ ์ด ๊ฝค๋‚˜ ์žˆ์ง€๋งŒ, ์ด ๋‚ด์šฉ๋“ค์€ ์ฐจ์ฐจ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์žฅ ์ค‘์š”ํ•œ ๋‚ด์šฉ์€ ์•„๋‹ˆ๊ฑฐ๋“ ์š”. ๋‹น์žฅ์€ ๋‹จ์ง€ class๊ฐ€ ๋‹จ์ˆœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ function์˜ ํŽธ์˜๋ฌธ๋ฒ•์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•ฉ์‹œ๋‹ค.

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ