관리 메뉴

Daehyunii's Dev-blog

17μž₯ μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 λ³Έλ¬Έ

πŸ“š Language & CS knowledge/JavaScript (λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive)

17μž₯ μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성

Daehyunii 2022. 7. 10. 16:35

  객체λ₯Ό μƒμ„±ν•˜λŠ” λ°©μ‹μ—λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ μ•žμ„œ 배운 객체 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜λŠ” 방법이 μžˆλ‹€. μ΄λ²ˆμ— 곡뢀 ν•  λ‚΄μš©μ€ μƒμ„±μž ν•¨μˆ˜λ₯Ό ν†΅ν•œ 객체 생성이닀.

 

17.1 Object μƒμ„±μž ν•¨μˆ˜(빌트인 μƒμ„±μž ν•¨μˆ˜)

  new μ—°μ‚°μžμ™€ ν•¨κ»˜ Object μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 빈 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. 빈 객체λ₯Ό μƒμ„±ν•œ 이후 ν”„λ‘œνΌν‹° λ˜λŠ” λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ 객체λ₯Ό μ™„μ„±ν•  수 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜λž€ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€. μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•΄ μƒμ„±λœ 객체λ₯Ό μΈμŠ€ν„΄μŠ€λΌ ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” Object μƒμ„±μž ν•¨μˆ˜ 외에도 μ—¬λŸ¬κ°€μ§€ 빌트인 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ œκ³΅ν•œλ‹€. (String, Number, Boolean, Function, Array, Date, RegExp, Promise λ“±λ“± (λͺ¨λ‘ 객체λ₯Ό μƒμ„±ν•˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‹€.))

const person = new Object(); // 빈 객체 μƒμ„±ν•˜μ—¬ person λ³€μˆ˜μ— ν• λ‹Ή

person.name = 'lee';
person.sayHello = function(){
    console.log(`Hi my name is ${this.name}`);
};

console.log(person); // {name: 'lee', sayHello: ƒ}
person.sayHello(); // Hi my name is lee

 

17.2 μƒμ„±μž ν•¨μˆ˜

17.2.1 객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성 λ°©μ‹μ˜ 문제점

  객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성 방식은 직관적이고 κ°„νŽΈν•˜λ‹€. ν•˜μ§€λ§Œ 객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성 방식은 단 ν•˜λ‚˜μ˜ 객체만 μƒμ„±ν•œλ‹€. λ”°λΌμ„œ λ™μΌν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό μ—¬λŸ¬ 개 생성해야 ν•˜λŠ” 경우 맀번 같은 ν”„λ‘œνΌν‹°λ₯Ό κΈ°μˆ ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ μ΄λ‹€. 

// 객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성

const circle1 = {
    radius : 10,
    getDiameter : function(){
        return 2 * this.radius;
    }
};

console.log(circle1.getDiameter()); // 20

const circle2 = {
    radius : 20,
    getDiameter : function(){
        return 2 * this.radius;
    }
};

console.log(circle2.getDiameter()); // 40

μœ„μ˜ μ½”λ“œ 처럼 ν”„λ‘œνΌν‹°λŠ” κ°μ²΄λ§ˆλ‹€ ν”„λ‘œνΌν‹° 값이 λ‹€λ₯Ό 수 μžˆμ§€λ§Œ λ©”μ„œλ“œλŠ” λ‚΄μš©μ΄ λ™μΌν•œ κ²½μš°κ°€ μΌλ°˜μ μ΄λ‹€. 객체 λ¦¬ν„°λŸ΄μ— μ˜ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” 경우 ν”„λ‘œνΌν‹° ꡬ쑰가 동일함에도 λΆˆκ΅¬ν•˜κ³  맀번 같은 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κΈ°μˆ ν•΄μ•Ό ν•œλ‹€. μ΄λŸ¬ν•œ 과정은 맀우 λΉ„νš¨μœ¨μ μ΄κ³ , λ©”λͺ¨λ¦¬ 곡간 ν™œμš©μ—λ„ 맀우 λΉ„νš¨μœ¨ 적이닀.

 

17.2.2 μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 λ°©μ‹μ˜ μž₯점

  μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 방식은 마치 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦Ώμ²˜λŸΌ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œνΌν‹° ꡬ쑰가 λ™μΌν•œ 객체 μ—¬λŸ¬ 개λ₯Ό κ°„νŽΈν•˜κ²Œ 생성할 수 μžˆλ‹€.(객체λ₯Ό μ°μ–΄λ‚΄λŠ” 틀이라고 μ΄ν•΄ν•˜λ©΄ νŽΈν•˜λ‹€.)

//μƒμ„±μž ν•¨μˆ˜λ₯Ό ν†΅ν•œ 객체 생성

function Circle(radius){
    this.radius = radius,
    this.getDiameter = function(){
        return 2 * this.radius;
    };
}

const circle1 = new Circle(10); // (λ°˜μ§€λ¦„μ΄ 10인 Circle 객체λ₯Ό 생성)
const circle2 = new Circle(20); // (λ°˜μ§€λ¦„μ΄ 20인 Circle 객체λ₯Ό 생성)

console.log(circle1.getDiameter()); // 20
console.log(circle2.getDiameter()); // 40

 

  μƒμ„±μž ν•¨μˆ˜λŠ” 이름 κ·ΈλŒ€λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜λ‹€. ν•˜μ§€λ§Œ 클래슀 기반 객체지ν–₯ μ–Έμ–΄λ“€μ˜ μƒμ„±μžμ™€λŠ” λ‹€λ₯΄κ²Œ κ·Έ ν˜•μ‹μ΄ μ •ν•΄μ Έ μžˆλŠ” 것이 μ•„λ‹ˆλΌ 일반 ν•¨μˆ˜μ™€ λ™μΌν•œ λ°©λ²•μœΌλ‘œ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ λ™μž‘ν•œλ‹€. λ°˜λŒ€λ‘œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ©΄ μƒμ„±μž ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ 일반 ν•¨μˆ˜λ‘œ λ™μž‘ν•œλ‹€.

 

β€»κΈ°μ΄ˆκ°œλ…

- this : 객체 μžμ‹ μ˜ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ 자기 μ°Έμ‘° λ³€μˆ˜λ‹€. thisκ°€ κ°€λ¦¬ν‚€λŠ” 값은 ν•¨μˆ˜ 호좜 방식에 따라 λ™μ μœΌλ‘œ 결정됨.

- 일반 ν•¨μˆ˜λ‘œμ„œ 호좜 : μ „μ—­ 객체λ₯Ό 가리킴

- λ©”μ„œλ“œλ‘œμ„œ 호좜 : λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 객체λ₯Ό κ°€λ₯΄ν‚΄(μ‰½κ²Œ λ§ν•˜λ©΄, ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 가지고 μžˆλŠ” 객체λ₯Ό 가리킴)

- μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜 : μƒμ„±μž ν•¨μˆ˜κ°€ λ―Έλž˜μ— 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό 가리킴

 

17.2.3 μƒμ„±μž ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

  μƒμ„±μž ν•¨μˆ˜μ˜ ν•¨μˆ˜ λͺΈμ²΄μ—μ„œ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 것은 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€. μƒμ„±μž ν•¨μˆ˜κ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ν•˜λŠ” 것은 ν•„μˆ˜μ΄κ³ , μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ— ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•˜κ³  μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•˜λŠ” 것은 μ˜΅μ…˜μ΄λ‹€. ν•˜μ§€λ§Œ 17.2.2μ—μ„œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό 보면 new μ—°μ‚°μžλ§Œ μžˆμ„λΏ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ν•˜λŠ” μ½”λ“œλŠ” 보이지 μ•ŠλŠ”λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 암묡적인 처리λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ν•œλ‹€. μƒμ„±μž ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같은 과정을 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

 

1. μΈμŠ€ν„΄μŠ€ 생성과 this 바인딩

  μ•”λ¬΅μ μœΌλ‘œ 빈 객체가 μƒμ„±λœλ‹€. 이 빈 객체가 μ™„μ„±λœ 것은 μ•„λ‹ˆμ§€λ§Œ μƒμ„±μž ν•¨μˆ˜κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ‹€. 그리고 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ 빈 μΈμŠ€ν„΄μŠ€λŠ” this에 λ°”μΈλ”©λœλ‹€. μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ˜ thisκ°€ μƒμ„±μž ν•¨μˆ˜κ°€ λ―Έλž˜μ— 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ΄μœ κ°€ λ°”λ‘œ 이것이닀. 이 μ²˜λ¦¬λŠ” ν•¨μˆ˜ λͺΈμ²΄μ˜ μ½”λ“œκ°€ ν•œ 쀄씩 μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„ 이전에 μ‹€ν–‰λœλ‹€.

function Circle(radius){
    console.log(this); // Circle {} 
    this.radius = radius,
    this.getDiameter = function(){
        return 2 * this.radius;
    };
}

const circle1 = new Circle(10); // (λ°˜μ§€λ¦„μ΄ 10인 Circle 객체λ₯Ό 생성)

 

2. μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”

  μƒμ„±μž ν•¨μˆ˜μ— κΈ°μˆ λ˜μ–΄ μžˆλŠ” μ½”λ“œκ°€ ν•œ 쀄씩 μ‹€ν–‰λ˜μ–΄ this에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€. 즉, μΈμŠ€ν„΄μŠ€μ— ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜κ³  μƒμ„±μž ν•¨μˆ˜κ°€ 인수둜 전달받은 μ΄ˆκΈ°κ°’μ„ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•˜μ—¬ μ΄ˆκΈ°ν™”ν•˜κ±°λ‚˜ 고정값을 ν• λ‹Ήν•œλ‹€. μ΄λŸ¬ν•œ μ²˜λ¦¬λŠ” κ°œλ°œμžκ°€ κΈ°μˆ ν•œλ‹€.

 

3. μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

  μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ˜ λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚˜λ©΄ μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜λœλ‹€. μ£Όμ˜ν•΄μ•Ό ν•  점은 λ§Œμ•½ thisκ°€ μ•„λ‹Œ λ‹€λ₯Έ 객체λ₯Ό λͺ…μ‹œμ μœΌλ‘œ λ°˜ν™˜ν•˜λ©΄ thisκ°€ λ°˜ν™˜λ˜μ§€ λͺ»ν•˜κ³  return 문에 λͺ…μ‹œν•œ 객체가 λ°˜ν™˜λœλ‹€.

function Circle(radius){
    this.radius = radius,
    this.getDiameter = function(){
        return 2 * this.radius;
    };
    return {}
}

const circle1 = new Circle(10); // λͺ…μ‹œμ μΈ 객체 λ°˜ν™˜λ¬ΈμœΌλ‘œ 빈 객체가 생성됨
const circle2 = new Circle(20); // λͺ…μ‹œμ μΈ 객체 λ°˜ν™˜λ¬ΈμœΌλ‘œ 빈 객체가 생성됨

console.log(circle1); // {}
console.log(circle2); // {}

  이처럼 μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λͺ…μ‹œμ μœΌλ‘œ thisκ°€ μ•„λ‹Œ λ‹€λ₯Έ 값을 λ°˜ν™˜ν•˜λŠ” 것은 μƒμ„±μž ν•¨μˆ˜μ˜ κΈ°λ³Έ λ™μž‘μ„ ν›Όμ†ν•˜λ―€λ‘œ, μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ return 문을 λ°˜λ“œμ‹œ μƒλž΅ν•΄μ•Ό ν•œλ‹€.

 

17.2.4 λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]]κ³Ό [[Construct]]

  ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ˜λŠ” ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ” 일반적인 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  수 μžˆλŠ” 것은 λ¬Όλ‘  μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  수 μžˆλ‹€. ν•¨μˆ˜λŠ” κ°μ²΄μ΄λ―€λ‘œ 일반 객체와 λ™μΌν•˜κ²Œ λ™μž‘ν•  수 μžˆλ‹€. ν•¨μˆ˜ κ°μ²΄λŠ” 일반 객체가 가지고 μžˆλŠ” λ‚΄λΆ€ 슬둯과 λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ 가지고 있기 λ•Œλ¬Έμ΄λ‹€. ν•˜μ§€λ§Œ ν•¨μˆ˜λŠ” 일반 κ°μ²΄μ™€λŠ” λ‹€λ₯΄λ‹€. 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€. λ”°λΌμ„œ ν•¨μˆ˜λŠ” μΆ”κ°€μ μœΌλ‘œ λ‚΄λΆ€ 슬둯과 λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό 가지고 μžˆλ‹€. κ·Έ 쀑 μ•Œμ•„μ•Ό ν•˜λŠ” λ‚΄λΆ€ λ©”μ„œλ“œλŠ” [[Call]]κ³Ό [[Construct]] λ‚΄λΆ€ λ©”μ„œλ“œμΈλ°, [[Call]]을 κ°–λŠ” ν•¨μˆ˜ 객체λ₯Ό callable이라 ν•˜λ©°, λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]]λ₯Ό κ°–λŠ” ν•¨μˆ˜ 객체λ₯Ό constructor라고 ν•˜λ©°, λ°˜λŒ€λ‘œ [[Construct]]λ₯Ό 갖지 μ•ŠλŠ” ν•¨μˆ˜ 객체λ₯Ό non-constructor라 ν•œλ‹€. callable은 호좜 ν•  수 μžˆλŠ” 객체 ν•¨μˆ˜λ₯Ό μ˜λ―Έν•˜λ©°, constructorλŠ” μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. 결둠적으둜 ν•¨μˆ˜ κ°μ²΄λŠ” λͺ¨λ‘ callableμ΄μ§€λ§Œ, λͺ¨λ“  ν•¨μˆ˜ 객체가 contructor인 것은 μ•„λ‹ˆλ‹€. μ‰½κ²Œ 말해, λͺ¨λ“  ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•  수 μžˆμ§€λ§Œ, λͺ¨λ“  ν•¨μˆ˜λ₯Ό new μ—°μ‚¬μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•  μˆ˜λŠ” μ—†λ‹€.

 

17.2.5 constructor와 non-constructor의 ꡬ뢄

  μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ μ •μ˜ 방식에 따라 ν•¨μˆ˜λ₯Ό constructor와 non-constructor둜 κ΅¬λΆ„ν•œλ‹€.

- constructor ν•¨μˆ˜ : ν•¨μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ ν‘œν˜„μ‹, 클래슀둜 μ •μ˜ν•œ ν•¨μˆ˜

- non-constructor ν•¨μˆ˜ : ES6 λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„, ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μ •μ˜ν•œ ν•¨μˆ˜ (μƒμ„±μž ν•¨μˆ˜λ‘œ 호좜 λΆˆκ°€λŠ₯)

λ§Œμ•½, non-constructor ν•¨μˆ˜λ₯Ό new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ TypeErrorκ°€ λ°œμƒν•œλ‹€.

 

17.2.6 new μ—°μ‚°μž

  일반 ν•¨μˆ˜μ™€ μƒμ„±μž ν•¨μˆ˜μ— νŠΉλ³„ν•œ ν˜•μ‹μ  μ°¨μ΄λŠ” μ—†λ‹€. new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ λ™μž‘ν•œλ‹€. 즉, ν•¨μˆ˜ 객체의 λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]]이 호좜되고, λ°˜λŒ€λ‘œ new μ—°μ‚¬μž 없이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λŠ” 일반 ν•¨μˆ˜λ‘œ λ™μž‘ν•œλ‹€. λ‹€μ‹œ 말해, ν•¨μˆ˜ 객체의 λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]]이 ν˜ΈμΆœλœλ‹€. 이 처럼 일반 ν•¨μˆ˜μ™€ μƒμ„±μž ν•¨μˆ˜μ— νŠΉλ³„ν•œ ν˜•μ‹μ  차이가 μ—†κΈ° λ•Œλ¬Έμ—, 이λ₯Ό κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ 파슀칼 μΌ€μ΄μŠ€λ‘œ μƒμ„±μž ν•¨μˆ˜λ₯Ό λͺ…λͺ…ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.