๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐ŸŒˆ Chapter 8 : ํด๋ž˜์Šค๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ผ.

๐ŸŽฏ ์ฝ๊ธฐ ์‰ฌ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ผ.โ€‹

  • ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
class Coupon {
}

const coupon = new Coupon();
  • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ๊ทธ๋‹ค์Œ์€ ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์— constructor()๋ผ๊ณ  ์ด๋ฆ„์„ ๋ถ™์ธ๋‹ค.
  • constructor()๋ฅผ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ๋ฒ•๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ function() ํ‚ค์›Œ๋“œ ์—†์ด ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ž์œ ๋กญ๊ฒŒ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ƒ์„ฑ์ž์˜ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๋Š” this ๋ฌธ๋งฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด์— ํ‚ค-๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ this์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํด๋ž˜์Šค์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ, ์ƒ์„ฑ์ž์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์†์„ฑ์„ ๋™์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋‘ ๊ฐœ์˜ ์†์„ฑ price์™€ expiration์„ ์„ค์ •.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
}
const coupon = new Coupon(5);
coupon.price; // 5
coupon['expiration']; // "2์ฃผ"
  • ๋‘ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€.
  • ์ƒ์„ฑ์ž์™€ ๋™์ผํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ณดํ†ต ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด this ๋ฌธ๋งฅ์— ์™„์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
getPriceText() {
return `$ ${this.price}`;
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์€ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
}
}
const coupon = new Coupon(5);
coupon.getPriceText(); // "$ 5"
coupon.getExpirationMessage(); // "์ด ์ฟ ํฐ์€ 2์ฃผ ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค."

๐ŸŽฏ ์ƒ์†์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณต์œ ํ•˜๋ผ.โ€‹

  • ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์œ„์—์„œ ์‚ฌ์šฉํ•œ Coupon ํด๋ž˜์Šค๋ฅผ extends๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
import Coupon from './extend';
class FlashCoupon extends Coupon {
}
const flash = new FlashCoupon(10);
flash.price; // 10
flash.getPriceText(); // "$ 10"
  • ์ƒˆ๋กœ์šด ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ƒ์†์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๋„ ์—†๋‹ค.
  • ์ƒˆ๋กœ์šด ์ƒ์„ฑ์ž์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ์ ‘๊ทผํ•˜๋ ค๋ฉด super()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • super()๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ํ•„์š”ํ•œ ์ธ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด super()๋ฅผ ์ด์šฉํ•ด์„œ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์ƒ์„ฑ์ž๊ฐ€ ์„ค์ •ํ•œ ์†์„ฑ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‹ค.
import Coupon from './extend';
class FlashCoupon extends Coupon {
constructor(price, expiration) {
super(price);
this.expiration = expiration || '2์‹œ๊ฐ„';
}
}
const flash = new FlashCoupon(10);
flash.price; // 10
flash.getExpirationMessage(); // "์ด ์ฟ ํฐ์€ 2์‹œ๊ฐ„ ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค."
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋จผ์ € ํ˜„์žฌ ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค ๋งŒ์•ฝ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ƒ์† ์—ฐ๊ฒฐ์˜ ์ƒ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€์„œ ๊ฐ ํด๋ž˜์Šค๋‚˜ ํ”„๋กœํ† ํƒ€์ž…์„ ํ™•์ธํ•œ๋‹ค.
  • ์ฆ‰, ํด๋ž˜์Šค์— ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ƒ์†ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์Œ ์˜ˆ์ œ๋Š” ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค.
  • ์ฃผ์˜ํ•  ์ ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ž์‹ ํด๋ž˜์Šค์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜๋ฉด ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๊ธฐ ์‰ฝ๋‹ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
getPriceText() {
return `$ ${this.price}`;
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์€ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
}
// ์ถ”๊ฐ€
isRewardsEligible(user) {
// ์ตœ๊ทผ์— ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์ด๋ฉฐ, ๋ณด์ƒ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
return user.rewardsEligible && user.active;
}
getRewards(user) {
if(this.isRewardsEligible(user)) {
this.price = this.price * 0.9;
}
}
}
export default Coupon;
  • ์ž์‹ ํด๋ž˜์Šค
import Coupon from './extend';
class FlashCoupon extends Coupon {
constructor(price, expiration) {
super(price);
this.expiration = expiration || '2์‹œ๊ฐ„';
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์€ ๊นœ์ง ์ฟ ํฐ์ด๋ฉฐ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
}
isRewardsEligible(user) {
// ์ตœ๊ทผ์— ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์ด๋ฉฐ, ๋ณด์ƒ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ƒํ’ˆ์˜ ๊ฐ€๊ฒฉ์ด 20๋‹ฌ๋Ÿฌ ์ด์ƒ
return super.isRewardsEligible(user) && this.price > 20;
}
getRewards(user) {
if(this.isRewardsEligible(user)) {
this.price = this.price * 0.8;
}
}
}
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฃจ๋น„, ์ž๋ฐ” ๋“ฑ๊ณผ ํด๋ž˜์Šค๋ฅผ ์“ฐ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ค๋ฅด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๋‹ค.

๐ŸŽฏ ํด๋ž˜์Šค๋กœ ๊ธฐ์กด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ํ™•์žฅํ•˜๋ผ.โ€‹

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํด๋ž˜์Šค์™€ ํ”„๋กœํ† ํƒ€์ž…์ด ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
  • ํด๋ž˜์Šค๋Š” ๋‹จ์ง€ ๋ณดํ†ต์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ด๋‹ค.
  • ์ „ํ†ต์ ์ธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์—์„œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— ๋ชจ๋“  ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณต์ œ๋œ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ๋Œ€์‹  ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•œ๋‹ค.
  • ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœํ† ํƒ€์ž…์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.(์ฐธ๊ณ )
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ class๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค๋Š” ๋‹จ์ง€ ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์†๊ธฐ๋ฒ•์ผ ๋ฟ์ธ ๊ฒƒ์ด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ„๋‹จํžˆ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋˜๋Š”๋ฐ ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์œผ๋กœ ํ•จ์ˆ˜๋ช…์„ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์†์„ฑ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • new ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉํ•˜๊ณ  this ๋ฌธ๋งฅ์„ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
  • ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค.
function Coupon(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
const coupon = new Coupon(5, '2๊ฐœ์›”');
coupon.price; // 5
  • new ํ‚ค์›Œ๋“œ๋กœ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ƒ์„ฑ์ž๋ฅผ ์‹คํ–‰ํ•˜๊ณ  this ๋ฌธ๋งฅ์„ ๋ฐ”์ธ๋”ฉํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณต์ œํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
  • ์ƒ์„ฑ์ž์—์„œ this์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ”„๋กœํ† ํƒ€์ž…์— ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ด๋‹ค.
  • ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ๋ชจ๋“  ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋Š” ํ”„๋กœํ† ํƒ€์ž…์—์„œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๊ณ , ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋„ ํ”„๋กœํ† ํƒ€์ž…์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
Coupon.prototype.getExpirationMessage = function() {
return `์ด ์ฟ ํฐ์€ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
};

coupon.getExpirationMessage(); // "์ด ์ฟ ํฐ์€ 2๊ฐœ์›” ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค."
  • class ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋„ ์—ฌ์ „ํžˆ ํ”„๋กœํ† ํƒ€์ž…์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฌธ๋งฅ(context)์„ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
  • ๋‹จ์ง€ class ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋”์šฑ ์ง๊ด€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” class ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋‹จ์ง€ ํ”„๋กœํ† ํƒ€์ž…์„ ์ƒ์„ฑํ•  ๋ฟ์ด๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํ† ํƒ€์ž…์„ ์ด์šฉํ•ด์„œ ์ƒ์„ฑํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์— ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
class FlashCoupon extends Coupon {
constructor(price, expiration) {
super(price);
this.expiration = expiration || '2์‹œ๊ฐ„';
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์€ ๊นœ์ง ์ฟ ํฐ์ด๋ฉฐ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
}
}

๐ŸŽฏ get๊ณผ set์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.โ€‹

  • ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์˜ ์†์„ฑ ์ค‘ ๋…ธ์ถœํ•  ์ƒ๊ฐ์ด ์—†์—ˆ๋˜ ๊ฒƒ์„ ๋ˆ„๊ตฐ๊ฐ€ ์กฐ์ž‘ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฃผ์š” ๋ฌธ์ œ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋น„๊ณต๊ฐœ(static) ์†์„ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค.
  • ์•„๋ž˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ price๋ฅผ ์ •์ˆ˜๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๋ฉด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
getPriceText() {
return `$ ${this.price}`;
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์€ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
}
}
const coupon = new Coupon(5);
coupon.price = '$10';
coupon.getPriceText(); // "$ $10"
  • ์ด๋Ÿด ๊ฒฝ์šฐ ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ getter์™€ setter๋ฅผ ์ด์šฉํ•ด์„œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์†์„ฑ์„ ๋’ค๋กœ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์œ„ ์˜ˆ์ œ ์ฝ”๋“œ์˜ ๋ฉ”์„œ๋“œ๋ฅผ getter๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
get priceText() {
return `$ ${this.price}`;
}
get expirationMessage() {
return `์ด ์ฟ ํฐ์€ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
}
}
  • ๊ฐ„๋‹จํ•œ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•œ ๋’ค์—๋Š” ์  ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ์—๋Š” ๊ด„ํ˜ธ๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
  • ์‹ค์ œ๋กœ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งˆ์น˜ ์†์„ฑ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค.
const coupon = new Coupon(5);
coupon.price = 10;
coupon.priceText; // "$ 10"
coupon.expirationMessage; // "์ด ์ฟ ํฐ์€ 2์ฃผ ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค."
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง€์ง€๋งŒ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.
  • ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” setter๋„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • setter๋Š” ๊ฒŒํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ ์ธ์ˆ˜๋ฅผ ํ•˜๋‚˜๋งŒ ๋ฐ›๊ณ , ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
  • setter์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ทธ ๋Œ€์‹  ๊ฐ์ฒด์— ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ฑํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
set halfPrice(price) {
this.price = price / 2;
}
}
  • setter์— ๋Œ€์‘๋˜๋Š” getter๊ฐ€ ์—†์œผ๋ฉด ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋Š” ์—†๋‹ค.
const coupon = new Coupon(5);
coupon.halfPrice = 20;
coupon.halfPrice; // undefined
  • getter๋‚˜ setter์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์†์„ฑ์€ ๋‘˜ ์ˆ˜ ์—†๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด price ์†์„ฑ์ด ์žˆ์„ ๋•Œ setter๋ฅผ ๋งŒ๋“ค๋ฉด ํ˜ธ์ถœ ์Šคํƒ์ด ๋ฌดํ•œํžˆ ์Œ“์ด๊ฒŒ ๋œ๋‹ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
get price() {
return this.price;
}
set price(price) {
this.price = `$ ${price}`;
}
}
const coupon = new Coupon(5);
// Uncaught RangeError: Maximum call stack size exceeded
  • ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค๋ฅธ ์†์„ฑ์„ getter์™€ setter ์‚ฌ์ด์˜ ๊ฐ€๊ต๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ˜„์žฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋น„๊ณต๊ฐœ ์†์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅผ ์ˆ˜๋ฐ–์— ์—†๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๋ฆ„ ์•ž์— ๋ฐ‘์ค„์„ ์ž…๋ ฅํ•ด ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์ด ๋น„๊ณต๊ฐœ๋ผ๋Š” ์ ์„ ํ‘œ์‹œํ•œ๋‹ค. (์˜ˆ: _price)
  • ์ด์ œ ์ •์ˆ˜๋งŒ ๋‚จ๊ธฐ๊ณ  ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋Š” ๋ชจ๋‘ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” setter๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
class Coupon {
constructor(price, expiration) {
this._price = price;
this.expiration = expiration || '2์ฃผ';
}
get priceText() {
return `$${this._price}`;
}
get price() {
return this._price;
}
set price(price) {
const newPrice = price.toString().replace(/[^\d]/g, '');
this._price = parseInt(newPrice, 10);
}
get expirationMessage() {
return `์ด ์ฟ ํฐ์€ ${this.expiration} ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.`;
}
}
const coupon = new Coupon(5);
coupon.price; // 5
coupon.price = '$10';
coupon.price; // 10
coupon.priceText; // $10
  • getter์™€ setter๊ฐ€ ๊ฐ€์ ธ๋‹ค์ฃผ๋Š” ํฐ ์ด์ ์€ ๋ณต์žก๋„๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
  • ๋‹จ์ ์€ ์ด์™€ ํ•จ๊ป˜ ์šฐ๋ฆฌ์˜ ์˜๋„๊นŒ์ง€ ๊ฐ€๋ ค์ง„๋‹ค๋Š” ์ ์ด๋‹ค.
  • getter์™€ setter๋Š” ๋•Œ๋•Œ๋กœ ๋””๋ฒ„๊น…ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ์™€ ๋ฌธ์„œํ™”๋ฅผ ํ†ตํ•ด ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

๐ŸŽฏ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ์ดํ„ฐ๋Ÿฌ๋ธ” ์†์„ฑ์„ ์ƒ์„ฑํ•˜๋ผ.โ€‹

  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(Generator)๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ํŠนํ™”๋œ ํ•จ์ˆ˜์ด๋‹ค.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” (MDN ์ฐธ๊ณ ) ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ๊ทธ ์ฆ‰์‹œ ๋๊นŒ์ง€ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ฐ„์— ๋น ์ ธ๋‚˜๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ์‹คํ–‰์„ ์ฆ‰์‹œ ๋๋‚ด์ง€ ์•Š๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์ด๋‹ค.
  • ์ฆ‰, ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„ ์ „๊นŒ์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผ์‹œ ์ •์ง€ํ•˜๋Š” ์ค‘๋‹จ์ ์ด ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด function ํ‚ค์›Œ๋“œ ๋’ค์— ๋ณ„ํ‘œ(*)๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•จ์ˆ˜์˜ ์ผ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” next()๋ผ๋Š” ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜ ๋ชธ์ฒด ์•ˆ์—์„œ๋Š” yield ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” next() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํ•จ์ˆ˜๊ฐ€ ๋‚ด๋ณด๋‚ธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • next()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ํ‚ค value์™€ done์ด ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ์—ฌ๊ธฐ์„œ yield๋กœ ์„ ์–ธํ•œ ํ•ญ๋ชฉ์ด value์ด๊ณ , done์€ ๋‚จ์€ ํ•ญ๋ชฉ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค.
function* getCairoTrilogy() {
yield '๊ถ์ „ ์ƒ›๊ธธ';
yield '์š•๋ง์˜ ๊ถ์ „';
yield '์„คํƒ• ๊ฑฐ๋ฆฌ';
}

const trilogy = getCairoTrilogy();
trilogy.next(); // {value: "๊ถ์ „ ์ƒ›๊ธธ", done: false}
trilogy.next(); // {value: "์š•๋ง์˜ ๊ถ์ „", done: false}
trilogy.next(); // {value: "์„คํƒ• ๊ฑฐ๋ฆฌ", done: false}
trilogy.next(); // {value: undefined, done: true}
  • ํ•จ์ˆ˜๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์กฐ๊ฐ์กฐ๊ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ •๋ณด์˜ ์ผ๋ถ€๋งŒ ๊บผ๋‚ด๊ณ  ๋‹ค์Œ ์กฐ๊ฐ์„ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ํ•œ, ๊ณ ์ฐจ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๊ณณ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ œ๋„ˆํ…Œ์ด๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ next() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ํ•„์š”ํ•œ ์ž‘์—…์€ ๋ฌด์—‡์ด๋“  ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฐฐ์—ด์— ๋‹ด์œผ๋ ค๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํŽผ์นจ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
[...getCairoTrilogy()];
// ["๊ถ์ „ ์ƒ›๊ธธ", "์š•๋ง์˜ ๊ถ์ „", "์„คํƒ• ๊ฑฐ๋ฆฌ"]
  • ์•„๋ž˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ for...of๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์— ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
const readingList = {
'๊นกํŒจ๋‹จ์˜ ๋ฐฉ๋ฌธ': true,
'๋งจํ•ดํŠผ ๋น„์น˜': false,
};
for(const book of getCairoTrilogy()) {
readingList[book] = false;
}
readingList;
// {
// ๊ถ์ „ ์ƒ›๊ธธ: false,
// ๊นกํŒจ๋‹จ์˜ ๋ฐฉ๋ฌธ: true,
// ๋งจํ•ดํŠผ ๋น„์น˜: false,
// ์„คํƒ• ๊ฑฐ๋ฆฌ: false,
// ์š•๋ง์˜ ๊ถ์ „: false,
// }
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค์—์„œ๋„ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” getter์™€ setter์ฒ˜๋Ÿผ ํด๋ž˜์Šค์— ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹จ์ˆœํ•œ ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์•„๋ž˜๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „ ๋นˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  family๋ฅผ ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
class FamilyTree {
constructor() {
this.family = {
name: 'Seung',
child: {
name: 'Harang',
child: {
name: 'Sa',
child: {
name: 'In',
},
},
},
};
}
getMembers() {
const family = [];
let node = this.family;
while(node) {
family.push(node.name);
node = node.child;
}
return family;
}
}
const family = new FamilyTree();
family.getMembers();
// ["Seung", "Harang", "Sa", "In"]
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์— ๋‹ด์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฒŒ๋‹ค๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ฐพ์•„๋ณผ ํ•„์š”๋„ ์—†์œผ๋ฉฐ, ๊ฐ€๊ณ„๋„๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์†์„ฑ์„ ๋งˆ์น˜ ๋ฐฐ์—ด์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
  • ๋จผ์ € ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ getMembers() ๋Œ€์‹  * [Symbol.iterator]()๋กœ ๋ฐ”๊พผ๋‹ค.
  • *๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œ์‹œํ•˜๊ณ , Symbol.iterator๋Š” ํด๋ž˜์Šค์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”์— ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. (๋งต ๊ฐ์ฒด๊ฐ€ ๋งต ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋น„์Šท)
  • ์•ž์„œ ์‚ดํŽด๋ณธ getCairoTrilogy() ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ๋‹ค๋ฅธ ์ ์€ ํŠน์ •ํ•œ ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๋Œ€์‹ ์— ๋ฐ˜๋ณต๋ฌธ์˜ ๋งคํšŒ๋งˆ๋‹ค yield๋กœ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๊ณ  ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด ๋‚จ์•„์žˆ๋Š” ํ•œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋œ๋‹ค.
  • family.push(node.name);์„ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹ ์— ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๊ฒฐ๊ด๊ฐ’์„ yield node.name์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.
  • ์ฆ‰, ์ค‘๊ฐ„ ๋‹จ๊ณ„์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๋‹ค.
  • ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํŽผ์นจ ์—ฐ์‚ฐ์ž๋‚˜ for...of ๋ฌธ์ฒ˜๋Ÿผ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ํ•„์š”ํ•œ ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ๋ฐ”๋กœ ํ˜ธ์ถœํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
class FamilyTree {
constructor() {
this.family = {
name: 'Seung',
child: {
name: 'Harang',
child: {
name: 'Sa',
child: {
name: 'In',
},
},
},
};
}
* [Symbol.iterator]() {
let node = this.family;
while(node) {
yield node.name;
node = node.child;
}
}
}
const family = new FamilyTree();
[...family];
// ["Seung", "Harang", "Sa", "In"]
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ด์ ์€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ํด๋ž˜์Šค์˜ ์„ธ๋ถ€ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๐ŸŽฏ bind()๋กœ ๋ฌธ๋งฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ผ.โ€‹

  • ๋ฌธ๋งฅ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, this ํ‚ค์›Œ๋“œ๋ฅผ ์ฝœ๋ฐฑ์ด๋‚˜ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ํŠนํžˆ ๋” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๋ฌธ์ œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค. (์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ฌธ๋งฅ ํ˜ผ๋™์„ ํ”ผํ•˜๋ผ)
  • ์—ฌ๊ธฐ์„œ ์‚ดํŽด๋ณผ ๊ธฐ๋ฒ•๋“ค์€ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ํด๋ž˜์Šค์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํด๋ž˜์Šค ๋ฌธ๋ฒ•๊ณผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ์ผ๋ฐ˜์ ์ด๋‹ค.
  • ๋‹ค์Œ์€ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.
class Validator {
constructor() {
this.message = '๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.';
}
setInvalidMessage(field) {
return `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage);
}
}
  • setInvalidMessages() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•œ this ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•œ๋‹ค.
  • setInvalidMessages() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ๋ฐฐ์—ด์— map()์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ฝœ๋ฐฑ์— setInvalidMessage() ๋ฉ”์„œ๋“œ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  map() ๋ฉ”์„œ๋“œ๊ฐ€ setInvalidMessage() ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์ด๋•Œ this๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์˜ ๋ฌธ๋งฅ(context)์œผ๋กœ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•œ๋‹ค.
const validator = new Validator();
validator.setInvalidMessages('๋„์‹œ');
// Uncaught TypeError: Cannot read property 'message' of undefined
  • ๋ฌธ๋งฅ ๋ฌธ์ œ๋Š” ๋ฆฌ์•กํŠธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฆฌ์•กํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ๋งฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ฐธ๊ณ 
  • ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ์ฑ…์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ฌธ๋งฅ ํ˜ผ๋™์„ ํ”ผํ•˜๋ผ์—์„œ ์ œ์•ˆํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•˜๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋ฉด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด this ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด ๋ฐฉ๋ฒ•์˜ ์œ ์ผํ•œ ๋‹จ์ ์€ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์†์„ฑ์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
class Validator {
constructor() {
this.message = '๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.';
this.setInvalidMessage = field => `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage);
}
}

const validator = new Validator();
validator.setInvalidMessages('๋„์‹œ');
// ["๋„์‹œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."]
  • ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑ์ž์˜ ์†์„ฑ์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋ฌธ๋งฅ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ ์ •์˜๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋˜ํ•œ, ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด ์ƒ์„ฑ์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋น„๋Œ€ํ•ด์ง„๋‹ค.
  • ๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์€ bind() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ชจ๋“  ํ•จ์ˆ˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” bind() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฌธ๋งฅ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜์—์„œ this๋กœ ์—ฐ๊ฒฐํ•  ๊ณณ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— this๋กœ ์ฐธ์กฐ๋œ ๊ณณ์„ ํ•ญ์ƒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
function sayMessage() {
return this.message;
}
const alert = {
message: '์œ„ํ—˜ํ•ด!',
};

const sayAlert = sayMessage.bind(alert);
sayAlert();
// "์œ„ํ—˜ํ•ด!"
  • ํ•จ์ˆ˜๊ฐ€ this๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์šฐ๋ฆฌ๊ฐ€ ์—ฐ๊ฒฐํ•œ ๊ฐ์ฒด๋กœ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๋‹ค.
  • ์ด๋Ÿฐ ๊ฒƒ์„ ๋ช…์‹œ์  ์—ฐ๊ฒฐ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ๋ฌธ๋งฅ์ด ๋Ÿฐํƒ€์ž„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ์„ค์ •๋˜์ง€ ์•Š๋„๋ก ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋ฌธ๋งฅ์„ ์„ ์–ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (์ฐธ๊ณ )
  • ์ด์ œ ํ•จ์ˆ˜๋ฅผ this์— ์—ฐ๊ฒฐํ•ด์„œ ๊ธฐ์กด์˜ ๋ฌธ๋งฅ์— ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
class Validator {
constructor() {
this.message = '๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.';
}
setInvalidMessage(field) {
return `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage.bind(this));
}
}

const validator = new Validator();
validator.setInvalidMessages('๋„์‹œ');
// ["๋„์‹œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."]
  • ์ด ๋ฐฉ๋ฒ•์˜ ์œ ์ผํ•œ ๋‹จ์ ์€ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด bind()๋กœ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๋ฐฉ๋ฒ•์˜ ์žฅ์ ์€ ๋ฉ”์„œ๋“œ๋ฅผ ์›๋ž˜์˜ ์œ„์น˜์— ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋‹จ์ง€ ์ƒ์„ฑ์ž์—์„œ this์— ์—ฐ๊ฒฐํ•  ๋ฟ์ด๋‹ค.
  • ์ด์ œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ํด๋ž˜์Šค์˜ ๋ชธ์ฒด ํ•œ ๊ณณ์— ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ์†์„ฑ์€ ์ƒ์„ฑ์ž์—์„œ ์„ ์–ธํ•˜๊ณ , ๋ฌธ๋งฅ๋„ ์†์„ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์„ฑ์ž์—์„œ๋งŒ ์„ค์ •ํ•œ๋‹ค.
class Validator {
constructor() {
this.message = '๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.';
this.setInvalidMessage = this.setInvalidMessage.bind(this);
}
setInvalidMessage(field) {
return `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage);
}
}

const validator = new Validator();
validator.setInvalidMessages('๋„์‹œ');
// ["๋„์‹œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."]
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹๊ณผ ํ•จ์ˆ˜๋ฅผ this์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹ ๋ชจ๋“œ ํ˜„์žฌ์˜ ๋ช…์„ธ์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค.
  • ์ถ”ํ›„์—๋Š” ์ƒ์„ฑ์ž ๋ฐ–์—์„œ ํด๋ž˜์Šค ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…์„ธ๊ฐ€ ๋„์ž…๋  ๊ฒƒ์ด๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ช…์„ธ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ์˜†์— ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์†์„ฑ์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
class Validator {
message = '๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.';
setMessage = field => `${field}${this.message}`;
setInvalidMessages(...fields) {
return fields.map(this.setMessage);
}
}

const validator = new Validator();
validator.setInvalidMessages('๋„์‹œ');
// ["๋„์‹œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."]
  • ๋ฐ”๋ฒจ์€ 7.0๋ถ€ํ„ฐ ํด๋ž˜์Šค ์†์„ฑ์„ ์ง€์›ํ•œ๋‹ค. ๊ณต๊ฐœ ํด๋ž˜์Šค ์†์„ฑ์€ ํฌ๋กฌ 72, ๋น„๊ณต๊ฐœ ํด๋ž˜์Šค ์†์„ฑ์€ ํฌ๋กฌ 74๋ถ€ํ„ฐ ์ง€์›ํ•˜๊ณ , Mode.js๋Š” ๋ฒ„์ „ 12๋ถ€ํ„ฐ ํด๋ž˜์Šค ์†์„ฑ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” REPL์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฌธ๋งฅ ์—ฐ๊ฒฐ์€ ๋น„์šฉ์ด ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŠน์ •ํ•œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.