Skip to content

Commit

Permalink
Merge pull request #1028 from Ryan-Dia/ryan-dia
Browse files Browse the repository at this point in the history
25-1μž₯ 클래슀 - 강철원
  • Loading branch information
Ryan-Dia authored Dec 19, 2023
2 parents 56dd04f + 5fb53db commit 026ab7d
Showing 1 changed file with 260 additions and 0 deletions.
260 changes: 260 additions & 0 deletions docs/25_클래슀/강철원B.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
**TIL(Today I learn) 기둝일** : 2023.12.20

# 25. πŸ₯Ž 클래슀

<br>

## πŸ“š λͺ©μ°¨

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



---

<br>

## 1. ν΄λž˜μŠ€λŠ” ν”„λ‘œν† νƒ€μž…μ˜ 문법적 섀탕인가?

❓ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ μ–Έμ–΄μž…λ‹ˆλ‹€.(비둝 λ‹€λ₯Έ 객체지ν–₯ μ–Έμ–΄μ™€μ˜ 차이점에 λŒ€ν•œ λ…ΌμŸμ΄ 있긴 ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” κ°•λ ₯ν•œ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° λŠ₯λ ₯을 μ§€λ‹ˆκ³  μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ μ–Έμ–΄λŠ” ν΄λž˜μŠ€κ°€ ν•„μš” μ—†λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μž…λ‹ˆλ‹€. ES5μ—μ„œλŠ” 클래슀 없이도 λ‹€μŒκ³Ό 같이 μƒˆμ„±μž ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž…μ„ 톡해 객체지ν–₯ μ–Έμ–΄μ˜ 상속을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

```js
function Person(name) {
this.name = name;
}

Person.prototype.sayHi = function () {
console.log(`Hi, I'm ${this.name}`);
};

const me = new Person('J');
me.sayHi(); // "Hi, I'm J"
```

- class 문법은 κΈ°μ‘΄ ν”„λ‘œν† νƒ€μž… 기반 νŒ¨ν„΄μ„ 클래슀 기반 νŒ¨ν„΄μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” ν•¨μˆ˜(문법적 섀탕)μž…λ‹ˆλ‹€.
- ν΄λž˜μŠ€μ™€ μƒμ„±μž ν•¨μˆ˜λŠ” λͺ¨λ‘ ν”„λ‘œν† νƒ€μž… 기반의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€λ§Œ, μ •ν™•νžˆ λ™μΌν•˜κ²Œ λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
- ν΄λž˜μŠ€λŠ” μƒμ„±μž ν•¨μˆ˜λ³΄λ‹€ μ—„κ²©ν•˜λ©° μƒμ„±μž ν•¨μˆ˜μ—μ„  μ œκ³΅ν•˜μ§€ μ•ŠλŠ” κΈ°λŠ₯도 μ œκ³΅ν•©λ‹ˆλ‹€.

❗️ ν΄λž˜μŠ€μ™€ μƒμ„±μž ν•¨μˆ˜μ˜ 차이점
- ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•΄μ•Ό ν•˜μ§€λ§Œ, μƒμ„±μž ν•¨μˆ˜λŠ” new μ—°μ‚°μžκ°€ 없어도 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
- μƒμ„±μž ν•¨μˆ˜μ™€ 달리 ν΄λž˜μŠ€λŠ” 상속을 μ§€μ›ν•˜λŠ” extends와 super ν‚€μ›Œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
- μƒμ„±μž ν•¨μˆ˜μ™€ 달리 ν΄λž˜μŠ€λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€.
- μƒμ„±μž ν•¨μˆ˜μ™€ 달리 ν΄λž˜μŠ€λŠ” λ‚΄λΆ€ μ½”λ“œμ—μ„œ μ•”λ¬΅μ μœΌλ‘œ strict modeκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
- 클래슀의 constructor, ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ, 정적 λ©”μ†Œλ“œλŠ” λͺ¨λ‘ ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈ [[Enumerable]] 이 false이기에 μ—΄κ±°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

<br>

---

## 2. 클래슀 μ •μ˜

ν΄λž˜μŠ€λŠ” `class` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•©λ‹ˆλ‹€.
클래슀 이름은 μƒμ„±μž ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 파슀칼 μΌ€μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.

```js
// 읡λͺ… 클래슀 ν‘œν˜„μ‹
const Person = class {};

// κΈ°λͺ… 클래슀 ν‘œν˜„μ‹
const Person = class MyClass {};
```

πŸ“Œ ν΄λž˜μŠ€λŠ” 일급 κ°μ²΄λ‘œμ„œ λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°–μŠ΅λ‹ˆλ‹€.
- 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성할 수 μžˆλ‹€. 즉, λŸ°νƒ€μž„μ— 생성이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
- λ³€μˆ˜λ‚˜ 자료ꡬ쑰(객체, λ°°μ—΄ λ“±)에 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ—κ²Œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺΈμ²΄μ—λŠ” λ©”μ†Œλ“œ (`constructor`, ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ, 정적 λ©”μ†Œλ“œ)만 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

```js
class Person {
// μΈμŠ€ν„΄μŠ€ 생성 및 μ΄ˆκΈ°ν™”
constructor(name) {
this.name = name; // public
}

// ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ
sayHi() {
console.log(`Hi I'm ${this.name}`);
}

// 정적 λ©”μ†Œλ“œ
static sayHello() {
console.log(`Hi I'm ${this.name}`);
}
}

const me = new Person('J');
me.sayHi(); // // "Hi I'm J"
Person.sayHello(); // "Hi I'm Person"
```

<br>

---

## 3. 클래슀 ν˜Έμ΄μŠ€νŒ…

클래슀 μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν΄λž˜μŠ€λŠ” ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό 같이 λŸ°νƒ€μž„ 이전에 λ¨Όμ € ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
μ΄λ•Œ ν•¨μˆ˜ κ°μ²΄λŠ” `constructor`이고 μƒμ„±μž ν•¨μˆ˜μ™€ ν•¨κ»˜ ν”„λ‘œν† νƒ€μž…λ„ μƒμ„±λ©λ‹ˆλ‹€.

```js
class Person {}

console.log(typeof Person); // function
```

>클래슀 μ •μ˜ 이전에 μ°Έμ‘°ν•  수 μ—†μ–΄ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘ν•©λ‹ˆλ‹€.
```js
const Person = '';

{
console.log(Person); // error
class Person {}
}
```

❓ λͺ¨λ“  선언문은 λŸ°νƒ€μž„ 이전에 μ‹€ν–‰λ©λ‹ˆλ‹€.

<br>

---

## 4. μΈμŠ€ν„΄μŠ€ 생성

>ν΄λž˜μŠ€λŠ” μƒμ„±μž ν•¨μˆ˜μ΄λ©° new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ–΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
```js
class Person {}

// μΈμŠ€ν„΄μŠ€ 생성
const me = new Person();
console.log(me); // Person {}
```

>ν•¨μˆ˜λŠ” newμ—°μ‚°μžμ˜ μ‚¬μš© 여뢀에 따라 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜κ±°λ‚˜ μΈμŠ€ν„΄μŠ€ 생성을 μœ„ν•œ μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜μ§€λ§Œ ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μœ μΌν•œ 쑴재 μ΄μœ μ΄λ―€λ‘œ λ°˜λ“œμ‹œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
```js
class Person {}
// 클래슀λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λ©΄ νƒ€μž… μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
const me = Person();
// TypeError: Class constructor Person cannot be invoked without 'new'
```
<br>

---

## 5. λ©”μ„œλ“œ

### 1) constructor

- μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ„œλ“œλ‘œ 이름을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
- λ‚΄λΆ€μ˜ `this`λŠ” ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
- `this`에 μΆ”κ°€ν•œ ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°κ°€ λ©λ‹ˆλ‹€.

```js
class Person {
constructor(name) {
this.name = name;
this.city = 'seoul';
}
}

const me = new Person('J');
console.log(me); // Person {name: 'J', city: 'seoul'}
```

- λ‹¨μˆœν•œ λ©”μ„œλ“œλ‘œ ν•΄μ„λ˜μ§€ μ•Šκ³ , ν΄λž˜μŠ€κ°€ ν‰κ°€λ˜μ–΄ μƒμ„±ν•œ ν•¨μˆ˜ 객체 μ½”λ“œμ˜ 일뢀가 λ©λ‹ˆλ‹€.
- ν•œ 개만 μ‘΄μž¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- μƒλž΅μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
```js
class Person {} // μ•„λž˜μ²˜λŸΌ 빈 constructorκ°€ μ•”λ¬΅μ μœΌλ‘œ μ •μ˜λ¨

class Person {
constructor() {}
}
```
- λ³„λ„μ˜ λ°˜ν™˜λ¬Έμ„ 갖지 μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

### 2) ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ

- ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ λ©”μ„œλ“œλŠ” 기본적으둜 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμž…λ‹ˆλ‹€.
- 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” ν”„λ‘œν† νƒ€μž… 체인의 μΌμ›μž…λ‹ˆλ‹€.

```js
class Person {
constructor(name) {
this.name = name;
}

sayHi() {
console.log(`Hi, I'm ${this.name}`);
}
}

const me = new Person('J');

console.log(Object.getPrototypeOf(me) === Person.prototype); // true
console.log(me instanceof Person); // true

console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype); // true
console.log(me instanceof Object); // true

console.log(me.constructor === Person); // true
```

### 3) 정적 λ©”μ„œλ“œ

μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.

- ν΄λž˜μŠ€λŠ” ν•¨μˆ˜ κ°μ²΄μ΄λ―€λ‘œ μžμ‹ μ˜ ν”„λ‘œνΌν‹°/λ©”μ„œλ“œλ₯Ό μ†Œμœ ν•  수 μžˆκΈ°μ—, 클래슀 μ •μ˜κ°€ ν‰κ°€λœ ν›„ 정적 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž… 체인엔 ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, μΈμŠ€ν„΄μŠ€λŠ” 클래슀의 λ©”μ„œλ“œλ₯Ό 상속받을 수 μ—†μŠ΅λ‹ˆλ‹€.

```js
class Person {
constructor(name) {
this.name = name;
}

static sayHi() {
console.log('Hi');
}
}

Person.sayHi(); // Hi
```

### 4) 정적 λ©”μ„œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ˜ 차이

>정적 λ©”μ„œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ˜ μ°¨μ΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
- 정적 λ©”μ„œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μžμ‹ μ΄ 속해 μžˆλŠ” ν”„λ‘œν† νƒ€μž… 체인이 λ‹€λ₯΄λ‹€.
- 정적 λ©”μ„œλ“œλŠ” 클래슀둜 ν˜ΈμΆœν•˜κ³  ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ‘œ ν˜ΈμΆœν•œλ‹€.
- 정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  수 μ—†μ§€λ§Œ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

❓ ν‘œμ€€ 빌트인 객체인 Math, Number, JSON, Object, Reflect 등은 λ‹€μ–‘ν•œ 정적 λ©”μ„œλ“œλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 정적 λ©”μ„œλ“œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ μ‚¬μš©ν•  μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μž…λ‹ˆλ‹€.

```js
// ν‘œμ€€ 빌트인 객체의 정적 λ©”μ„œλ“œ
Math.max(1, 2, 3); // -> 3
Number.isNaN(NaN); // -> true
JSON.stringify({ a: 1 }); // -> "{"a":1}"
Object.is({}, {}); // -> false
Reflect.has({ a: 1 }, 'a'); // -> true
```

### 5) ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ λ©”μ„œλ“œμ˜ νŠΉμ§•

>ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°–μŠ΅λ‹ˆλ‹€.
1. `function` ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•œ λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μ„ μ‚¬μš©ν•œλ‹€.
2. 객체 λ¦¬ν„°λŸ΄κ³ΌλŠ” λ‹€λ₯΄κ²Œ ν΄λž˜μŠ€μ— λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•ŒλŠ” μ½€λ§ˆκ°€ ν•„μš”μ—†λ‹€.
3. μ•”λ¬΅μ μœΌλ‘œ `strict mode`둜 μ‹€ν–‰λœλ‹€.
4. `for...in` λ¬Έμ΄λ‚˜ `Object.keys` λ©”μ„œλ“œ λ“±μœΌλ‘œ μ—΄κ±°ν•  수 μ—†λ‹€. 즉 ν”„λ‘œνΌν‹°μ˜ μ—΄κ±° κ°€λŠ₯ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λ©°, λΆˆλ¦¬μ–Έ 값을 κ°–λŠ” ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈ `[[Enumerable]]`의 값이 `false`λ‹€.
5. λ‚΄λΆ€ λ©”μ„œλ“œ `[[Construct]]`λ₯Ό 갖지 μ•ŠλŠ” `non-constructor`λ‹€. λ”°λΌμ„œ `new` μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•  수 μ—†λ‹€.


0 comments on commit 026ab7d

Please sign in to comment.