Skip to content

Commit

Permalink
Merge pull request #1034 from Ryan-Dia/ryan-dia
Browse files Browse the repository at this point in the history
25-2μž₯ 클래슀 - 강철원
  • Loading branch information
Ryan-Dia authored Dec 20, 2023
2 parents ce23fd2 + 67e0d4a commit 292ab11
Showing 1 changed file with 156 additions and 2 deletions.
158 changes: 156 additions & 2 deletions docs/25_클래슀/강철원B.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@

[1. ν΄λž˜μŠ€λŠ” ν”„λ‘œν† νƒ€μž…μ˜ 문법적 섀탕인가?](#1-ν΄λž˜μŠ€λŠ”-ν”„λ‘œν† νƒ€μž…μ˜-문법적-섀탕인가)
[2. 클래슀 μ •μ˜](#2-클래슀-μ •μ˜)
[3. 클래슀](#3-클래슀)
[3. 클래슀 ν˜Έμ΄μŠ€νŒ…](#3-클래슀-ν˜Έμ΄μŠ€νŒ…)
[4. μΈμŠ€ν„΄μŠ€ 생성](#4-μΈμŠ€ν„΄μŠ€-생성)
[5. λ©”μ„œλ“œ](#5-λ©”μ„œλ“œ)

[6. 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •](#6-클래슀의-μΈμŠ€ν„΄μŠ€-생성-κ³Όμ •)
[7. ν”„λ‘œνΌν‹°](#7-ν”„λ‘œνΌν‹°)


---
Expand Down Expand Up @@ -257,4 +258,157 @@ Reflect.has({ a: 1 }, 'a'); // -> true
4. `for...in` λ¬Έμ΄λ‚˜ `Object.keys` λ©”μ„œλ“œ λ“±μœΌλ‘œ μ—΄κ±°ν•  수 μ—†λ‹€. 즉 ν”„λ‘œνΌν‹°μ˜ μ—΄κ±° κ°€λŠ₯ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λ©°, λΆˆλ¦¬μ–Έ 값을 κ°–λŠ” ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈ `[[Enumerable]]`의 값이 `false`λ‹€.
5. λ‚΄λΆ€ λ©”μ„œλ“œ `[[Construct]]`λ₯Ό 갖지 μ•ŠλŠ” `non-constructor`λ‹€. λ”°λΌμ„œ `new` μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•  수 μ—†λ‹€.

## 6. 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

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

`new`μ—°μ‚°μžμ™€ ν•¨κ»˜ 클래슀 호좜 μ‹œ, constructor μ‹€ν–‰ 이전에 μΈμŠ€ν„΄μŠ€(빈 객체)κ°€ μƒμ„±λ˜κ³ , μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ 클래슀의 `prototype`객체가 μ„€μ •λ©λ‹ˆλ‹€. 그리고 μΈμŠ€ν„΄μŠ€κ°€ `this`에 바인딩 λ©λ‹ˆλ‹€.

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

`constructor`κ°€ μ‹€ν–‰λ˜μ–΄ `this`에 바인딩 된 μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

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

μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ 바인딩 된 `this`κ°€ μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€.

```js
class Person {
// μƒμ„±μž
constructor(name) {
// 1. μ•”λ¬΅μ μœΌλ‘œ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³  this에 λ°”μΈλ”©λœλ‹€.
console.log(this); // Person {}
console.log(Object.getPrototypeOf(this) === Person.prototype); // true

// 2. this에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.
this.name = name;

// 3. μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ thisκ°€ μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜λœλ‹€.
}
}
```

## 7. ν”„λ‘œνΌν‹°

### 1) μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°

>μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λŠ” `constructor`λ‚΄λΆ€μ—μ„œ μ •μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
```js
class Person {
constructor(name) {
// μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°
this.name = name;
}
}

const me = new Person('Lee');
console.log(me); // Person {name: "Lee"}
```

`constructor` λ‚΄λΆ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전에 `constructor λ‚΄λΆ€μ˜ `this`μ—λŠ” 이미 ν΄λž˜μŠ€κ°€ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μΈ 빈 객체가 λ°”μΈλ”©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μƒμ„±μž ν•¨μˆ˜μ—μ„œ μƒμ„±μž ν•¨μˆ˜κ°€ 생성할 μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜λŠ” 것과 λ§ˆμ°¬κ°€μ§€λ‘œ `constructor`λ‚΄λΆ€μ—μ„œ `this`에 μΈμŠ€ν„°μŠ€ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. 이둜써 ν΄λž˜μŠ€λŠ” μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œ 빈 객체, 즉 μΈμŠ€ν„΄μŠ€μ— ν”„λ‘œνΌν‹°κ°€ μΆ”κ°€λ˜μ–΄ μΈμŠ€ν„΄μŠ€κ°€ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.

### 2) μ ‘κ·Όμž ν”„λ‘œνΌν‹°

μ ‘κ·Όμž ν”„λ‘œνΌν‹°λŠ” 자체적으둜 κ°’([[Value]] λ‚΄λΆ€ 슬둯)을 갖지 μ•Šκ³  λ‹€λ₯Έ 데이터 ν”„λ‘œνΌν‹°μ˜ 값을 μ½κ±°λ‚˜ μ €μž₯ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ ‘κ·Όμž ν•¨μˆ˜λ‘œ κ΅¬μ„±λœ ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€.

```js
const person = {
// 데이터 ν”„λ‘œνΌν‹°
firstName: 'Ungmo',
lastName: 'Lee',

// fullName은 μ ‘κ·Όμž ν•¨μˆ˜λ‘œ κ΅¬μ„±λœ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‹€.
// getter ν•¨μˆ˜
get fullName() {
return `${this.firstName} ${this.lastName}`;
},
// setter ν•¨μˆ˜
set fullName(name) {
// λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ή: "36.1. λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ή" μ°Έκ³ 
[this.firstName, this.lastName] = name.split(' ');
}
};

// 데이터 ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•œ ν”„λ‘œνΌν‹° κ°’μ˜ μ°Έμ‘°.
console.log(`${person.firstName} ${person.lastName}`); // Ungmo Lee

// μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•œ ν”„λ‘œνΌν‹° κ°’μ˜ μ €μž₯
// μ ‘κ·Όμž ν”„λ‘œνΌν‹° fullName에 값을 μ €μž₯ν•˜λ©΄ setter ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.
person.fullName = 'Heegun Lee';
console.log(person); // {firstName: "Heegun", lastName: "Lee"}

// μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•œ ν”„λ‘œνΌν‹° κ°’μ˜ μ°Έμ‘°
// μ ‘κ·Όμž ν”„λ‘œνΌν‹° fullName에 μ ‘κ·Όν•˜λ©΄ getter ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.
console.log(person.fullName); // Heegun Lee

// fullName은 μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‹€.
// μ ‘κ·Όμž ν”„λ‘œνΌν‹°λŠ” get, set, enumerable, configurable ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό κ°–λŠ”λ‹€.
console.log(Object.getOwnPropertyDescriptor(person, 'fullName'));
// {get: Ζ’, set: Ζ’, enumerable: true, configurable: true}
```

### 3) 클래슀 ν•„λ“œ μ •μ˜ μ œμ•ˆ

클래슀 ν•„λ“œ(ν•„λ“œ λ˜λŠ” 멀버)λŠ” 클래슀 기반 객체지ν–₯ μ–Έμ–΄μ—μ„œ ν΄λž˜μŠ€κ°€ 생성할 μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°λ₯Ό κ°€λ¦¬ν‚€λŠ” μš©μ–΄μž…λ‹ˆλ‹€.

>μžλ°”μ˜ 클래슀 ν•„λ“œλŠ” 마치 클래슀 λ‚΄λΆ€μ—μ„œ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λ©λ‹ˆλ‹€.
```java
// μžλ°”μ˜ 클래슀 μ •μ˜
public class Person {
// β‘  클래슀 ν•„λ“œ μ •μ˜
// 클래슀 ν•„λ“œλŠ” 클래슀 λͺΈμ²΄μ— this 없이 μ„ μ–Έν•΄μ•Ό ν•œλ‹€.
private String firstName = "";
private String lastName = "";

// μƒμ„±μž
Person(String firstName, String lastName) {
// β‘’ thisλŠ” μ–Έμ œλ‚˜ ν΄λž˜μŠ€κ°€ 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀.
this.firstName = firstName;
this.lastName = lastName;
}

public String getFullName() {
// β‘‘ 클래슀 ν•„λ“œ μ°Έμ‘°
// this 없이도 클래슀 ν•„λ“œλ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.
return firstName + " " + lastName;
}
}
```

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™”ν•˜λ €λ©΄ λ°˜λ“œμ‹œ `constructor` λ‚΄λΆ€μ—μ„œ `this`에 ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μžλ°”μ˜ ν΄λž˜μŠ€μ—μ„œλŠ” μœ„ 예제의 β‘ κ³Ό 같이 클래슀 ν•„λ“œλ₯Ό 마치 λ³€μˆ˜μ²˜λŸΌ 클래슀 λͺΈμ²΄μ— this없이 μ„ μ–Έν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 클래슀 λͺΈμ²΄μ—λŠ” λ©”μ„œλ“œλ§Œ μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 클래슀 λͺΈμ²΄μ— μžλ°”μ™€ μœ μ‚¬ν•˜κ²Œ 클래슀 ν•„λ“œλ₯Ό μ„ μ–Έν•˜λ©΄ 문법 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

```js
class Person {
// 클래슀 ν•„λ“œ μ •μ˜
name = 'Lee';
}

const me = new Person('Lee');
```

ν•˜μ§€λ§Œ μœ„ μ˜ˆμ œλŠ” μ΅œμ‹  λΈŒλΌμš°μ € λ˜λŠ” Node.js(12 이상)μ—μ„œ 문법 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  정상 λ™μž‘ν•©λ‹ˆλ‹€.([μ°Έκ³ ](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes))
클래슀 λͺΈμ²΄μ—μ„œ 클래슀 ν•„λ“œλ₯Ό μ •μ˜ν•  수 μžˆλŠ” 클래슀 ν•„λ“œ μ •μ˜ μ œμ•ˆμ€ 아직 ECMAScript의 정식 ν‘œμ€€ μ‚¬μ–‘μœΌλ‘œ μŠΉκΈ‰λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€(4단계)
ν•˜μ§€λ§Œ μ΅œμ‹  λΈŒλΌμš°μ €μ™€ μ΅œμ‹  Node.jsμ—μ„œλŠ” λ‹€μŒ μ˜ˆμ œμ™€ 같이 클래슀 ν•„λ“œλ₯Ό 클래슀 λͺΈμ²΄μ— μ •μ˜ν•  수 μžˆλ‹€.

```js
class Person {
// 클래슀 ν•„λ“œ μ •μ˜
name = 'Lee';
age = 23;
}

const me = new Person();
console.log(me); // Person {name: "Lee" , age: 23}
console.log(me.age); // 23
```

>클래슀 λͺΈμ²΄μ—μ„œ 클래슀 ν•„λ“œλ₯Ό μ •μ˜ν•˜λŠ” 경우 this에 클래슀 ν•„λ“œλ₯Ό λ°”μΈλ”©ν•΄μ„œλŠ” μ•ˆ λœλ‹€. thisλŠ” 클래슀의 constructor와 λ©”μ„œλ“œ λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.
```js
class Person {
// this에 클래슀 ν•„λ“œλ₯Ό λ°”μΈλ”©ν•΄μ„œλŠ” μ•ˆλœλ‹€.
this.name = ''; // SyntaxError: Unexpected token '.'
}

```

0 comments on commit 292ab11

Please sign in to comment.