๐Ÿ“JS Class ๊ณต๋ถ€ ์ผ์ง€ - ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ class์˜ ์ฐจ์ด

๊น€์˜์šฐยท2022๋…„ 11์›” 21์ผ
0
post-thumbnail

๐Ÿ˜ญ ๋™๊ธฐ(?)

์ฒ˜์Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต๋ถ€ํ–ˆ์„ ๋•Œ๋Š” DOM API๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋งŒ์„ ํ–ˆ์—ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณผ์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ ํ’€์—ˆ์„ ๋•Œ์˜ ์ฝ”๋“œ๋งŒ ๋ณด๋”๋ผ๋„ ์ฒ˜์ฐธํ–ˆ๋˜ ๊ณผ๊ฑฐ ์‹ค๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฒ€์ƒ‰ (์ฒซ ์‹œ๋„) ์ฐธ์กฐ)

๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•จ์„ ๋Š๊ปด ๊ณผ์ œํ…Œ์ŠคํŠธ์˜ ์ •๋‹ต์„ ๋ณด์•˜๋‹ค. ์ •๋‹ต์„ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹์„ ์ตํ˜€๋ณด๊ณ , ์ด๋ฅผ ์ ์šฉํ•ด ์ƒˆ๋กญ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด๋ฉฐ ์–ด๋Š์ •๋„ ์‹ค๋ ฅ์ด ์Œ“์˜€๋‹ค๊ณ  ์ฐฉ๊ฐํ–ˆ์—ˆ๋‹ค. (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฒ€์ƒ‰ (์™„) ์ฐธ์กฐ)

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๋‚˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋งŒ์„ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค. ๊ทผ๋ฐ ์ด๊ฒŒ ์›ฌ๊ฑธ? ์šฐํ…Œ์ฝ” 5๊ธฐ ํ”„๋ฆฌ์ฝ”์Šค์— ์ฃผ์–ด์ง„ ์ฝ”๋“œ๋“ค์€ class๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋†“์•˜๋‹ค. ์ž‘์€ ๋ณ€ํ™”์—๋„ ๊ตฌํ˜„์ด ๋ง์„ค์—ฌ์ง€๋Š” ๋‚ด ๋ชจ์Šต์„ ๋ณด๋ฉฐ ๊ทผ๋ณธ์ ์ธ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•จ์„ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋ฒˆ ๊ธฐํšŒ์— ๊ณต๋ถ€ํ•ด๋ณด์ž ์‹ถ์–ด ํ”„๋ฆฌ์ฝ”์Šค ๊ธฐ๊ฐ„๋™์•ˆ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠœํ† ๋ฆฌ์–ผ์„ ๋ณด๋ฉฐ ๊ทผ๋ณธ์ ์ธ ๊ณต๋ถ€๋ฅผ ํ•ด๋‚˜๊ฐ”๊ณ , ์ด๋•Œ ๊ณต๋ถ€ํ•œ class์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.


โ—์ƒ์„ฑ์ž ํ•จ์ˆ˜ vs class

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ž‘ class์˜ ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ?

์ผ๋‹จ ๋‚ด๊ฐ€ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•œ ์ด์œ ๋Š” ์œ„ ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

function User(name) {
  this.name = name;

  this.callName = () => {
    console.log(this.name);
  };
}

const user = new User("์šฐํ…Œ์ฝ”");
user.callName();

ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ User์— new๋ฅผ ๋ถ™์—ฌ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ด๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์šฐํ…Œ์ฝ”๊ฐ€ ์ฝ˜์†”์— ์ถœ๋ ฅ๋œ๋‹ค.

๋งˆ์น˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

  1. ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด this์— ํ• ๋‹นํ•œ๋‹ค.
  2. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์‹คํ–‰์‹œ์ผœ this์— ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
  3. this๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋ฒˆ์—” class์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

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

const user = new User("์šฐํ…Œ์ฝ”");
user.callName();

์ด์ „ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ด๋ ‡๊ฒŒ๋งŒ ๋ณด๋ฉด new๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ–ˆ๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ด์ค€๋‹ค๋Š” ์ ์—์„œ ๋‘ ์˜ˆ์‹œ๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•ด๋ณด์ธ๋‹ค.

class์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

  1. User๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.
    1-1. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์€ ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.
    1-2. ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ณธ๋ฌธ์ด ๋น„์›Œ์ง„์ฑ„๋กœ ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  2. ํด๋ž˜์Šค ๋‚ด์— ์ •์˜ํ•œ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ๋ฅผ User.prototype์— ์ €์žฅํ•œ๋‹ค.

์˜ค์ž‰...? ๊ฒฐ๊ตญ์—” class๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๊ฐ์ฒด๋„ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋” ์ฐพ์•„๋ณด๋‹ˆ ๋‘ ๋ฐฉ์‹์€

  1. class๋กœ ๋งŒ๋“  ํ•จ์ˆ˜์—” ํŠน์ˆ˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ [[IsClassConstructor]]: true๊ฐ€ ๋ถ™๋Š”๋‹ค.
  2. ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค. (non-enumerableํ•˜๋‹ค)
  3. ํด๋ž˜์Šค๋Š” ํ•ญ์ƒ ์—„๊ฒฉ ๋ชจ๋“œ๋กœ ์‹คํ–‰๋œ๋‹ค.

์˜ ์„ธ๊ฐ€์ง€ ์ฐจ์ด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.


๐Ÿง[[IsClassConstructor]]๋ž€?

function ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ Userํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ User์ž์ฒด๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ new User๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

ํ•˜์ง€๋งŒ class๋ฅผ ํ†ตํ•ด ๋งŒ๋“  User ํด๋ž˜์Šค๋Š” ์ค‘๊ฐ„์— ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ๋˜๊ธด ํ•˜์ง€๋งŒ User ์ž์ฒด๋กœ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ์š”์ธ์ด ๋ฐ”๋กœ [[IsClassConstructor]]: true์ธ ๊ฒƒ์ด๋‹ค.

๋˜, class๋ฅผ ํ†ตํ•ด ๋งŒ๋“  User ํด๋ž˜์Šค๋Š” console.log๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถœ๋ ฅํ•  ๋•Œ class User {...}์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š”๋ฐ, ์ด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์š”์ธ๋„ [[IsClassConstructor]]: true์ด๋‹ค.

์ •๋ฆฌํ•ด๋ณด์ž๋ฉด [[IsClassConstructor]]: true๋Š” class๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๊ฐ์ฒด๊ฐ€ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜๋˜์—ˆ์„ ๋•Œ ๊ทธ๋ƒฅ function์„ ํ†ตํ•ด ๋งŒ๋“  ํ•จ์ˆ˜์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์š”์†Œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿงnon-enumerable๋ž€?

๋‹ค์Œ ๋‘ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

js์˜ for ...in์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•  ๋•Œ ์ฒซ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„  ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถœ๋ ฅ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‘๋ฒˆ์งธ ์˜ˆ์‹œ์—์„  ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ†ต์˜ ๊ฒฝ์šฐ์— ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•  ๋•Œ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆœํšŒ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์œ ์šฉํ•œ ํŠน์ง•์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ •๋ฆฌํ•ด๋ณด์ž๋ฉด non-enumerableํ•œ ํŠน์„ฑ์€ ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•  ๋•Œ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๋Š” ํŠน์„ฑ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿง์—„๊ฒฉ ๋ชจ๋“œ๋ž€?

์—„๊ฒฉ ๋ชจ๋“œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•˜๋ ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์—ญ์‚ฌ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์•Œ์•„์•ผํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ์กด์˜ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด์™”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ์ฝ”๋“œ๋“ค์„ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ES5์—์„œ๋ถ€ํ„ฐ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉฐ ๊ธฐ์กด์˜ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผฐ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด ์ฝ”๋“œ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ๋Œ€๋ถ€๋ถ„์ด ES5์˜ ๊ธฐ๋ณธ๋ชจ๋“œ์—์„œ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. ๋Œ€์‹  use strict๋ผ๋Š” ํŠน๋ณ„ ์ง€์‹œ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์—„๊ฒฉ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™” ํ–ˆ์„ ๋Œ€๋งŒ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ํ™œ์„ฑํ™” ๋˜๊ฒŒ ํ•ด๋†“์•˜๋‹ค.

์ •๋ฆฌํ•ด๋ณด์ž๋ฉด ์—„๊ฒฉ ๋ชจ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•œ ์‚ฌํ•ญ์„ ํ™œ์„ฑํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
๋ถˆํŽธํ•œ ์ผ๋“ค์„ ๊ฐœ๋ฐœ๋กœ ํ’€์–ด๋‚ด๊ณ  ์‹ถ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!

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