Skip to content

Commit

Permalink
Merge pull request #1022 from llqqssttyy/llqqssttyy
Browse files Browse the repository at this point in the history
25-1μž₯ 클래슀 - 김닀은
  • Loading branch information
Ryan-Dia authored Dec 19, 2023
2 parents 1ce64d9 + c04ecba commit 1b5115b
Showing 1 changed file with 110 additions and 0 deletions.
110 changes: 110 additions & 0 deletions docs/25_클래슀/김닀은.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# 25μž₯ 클래슀

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

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ μ–Έμ–΄λ‘œ ν΄λž˜μŠ€κ°€ ν•„μš”μ—†λ‹€. μƒμ„±μž ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž…μ„ 톡해 상속을 κ΅¬ν˜„ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. ν•œνŽΈ 클래슀 기반 언어에 μ΅μˆ™ν•œ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ—κ²ŒλŠ” 이것이 μž₯벽이 될 수 μžˆμœΌλ―€λ‘œ 그듀이 더 λΉ λ₯΄κ²Œ ν•™μŠ΅ν•  수 μžˆλ„λ‘ ES6μ—μ„œ μƒˆλ‘œμš΄ 객체 생성 λ§€μ»€λ‹ˆμ¦˜μ„ μ œμ‹œν•˜λŠ”λ°, 그것이 λ°”λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν΄λž˜μŠ€μ΄λ‹€. λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν΄λž˜μŠ€λŠ” 문법적 섀탕이라고 λ³Ό μˆ˜λ„ μžˆλ‹€.

ν•˜μ§€λ§Œ μƒμ„±μž ν•¨μˆ˜μ™€ ν΄λž˜μŠ€κ°€ μ •ν™•ν•˜κ²Œ λ™μΌν•˜κ²Œ λ™μž‘ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

1. 클래슀λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μƒμ„±μž ν•¨μˆ˜λŠ” new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λ©΄ 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλœλ‹€.
2. ν΄λž˜μŠ€λŠ” extends와 super ν‚€μ›Œλ“œλ‘œ 상속을 μ§€μ›ν•œλ‹€. μƒμ„±μž ν•¨μˆ˜λŠ” ν•΄λ‹Ή ν‚€μ›Œλ“œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
3. ν΄λž˜μŠ€λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것 처럼 λ™μž‘ν•œλ‹€. μƒμ„±μž ν•¨μˆ˜λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•œλ‹€.
4. 클래슀 λ‚΄μ˜ λͺ¨λ“  μ½”λ“œλŠ” μ•”λ¬΅μ μœΌλ‘œ strict modeκ°€ μ§€μ •λœλ‹€. μƒμ„±μž ν•¨μˆ˜λŠ” 그렇지 μ•Šλ‹€.
5. 클래슀의 constructor, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œλŠ” λͺ¨λ‘ [[Enumerable]]이 falseλ‹€.

μ΄λŸ¬ν•œ 차이점 λ•Œλ¬Έμ— ν΄λž˜μŠ€λŠ” λ‹¨μˆœν•œ 문법적 섀탕이라기 보단 **μƒˆλ‘œμš΄ 객체 생성 λ§€μ»€λ‹ˆμ¦˜**으둜 λ³΄λŠ” 것이 ν•©λ‹Ήν•˜λ‹€.

<br/>

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

```js
// 클래슀 μ„ μ–Έλ¬Έ
class Person {}

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

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

클래슀λ₯Ό ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€λŠ” 것은 ν΄λž˜μŠ€κ°€ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” 일급 κ°μ²΄λΌλŠ” 것을 μ˜λ―Έν•œλ‹€.

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

sayHi() {
console.log(`Hi! My name is ${this.name}`);
}

static sayHello() {
console.log('Hello');
}
}
```

<br/>

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

클래슀 μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν΄λž˜μŠ€λŠ” λŸ°ν„°μž„ 이전에 λ¨Όμ € ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€.(평과 κ²°κ³ΌλŠ” constructor ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž… μŒμ΄λ‹€.) 단, **ν΄λž˜μŠ€λŠ” 클래슀 μ •μ˜ 이전에 μ°Έμ‘°ν•  수 μ—†λ‹€**.

κ·Έλ ‡λ‹€κ³  ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ” 건 μ•„λ‹ˆλ‹€. λ‹€λ§Œ let, const처럼 μΌμ‹œμ  μ‚¬κ°μ§€λŒ€μ— λΉ μ Έ ν˜Έμ΄μŠ€νŒ…μ΄ λ™μž‘ν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

<br/>

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

```js
class Person {}

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

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

클래슀 μ•ˆμ—μ„  constructor, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.

### 1. constructor

> μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ„œλ“œ.
constructor의 prototype ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” ν”„λ‘œν† νƒ€μž… κ°μ²΄λŠ” 클래슀 μžμ‹ μ΄λ‹€. constructor λ‚΄λΆ€μ—μ„œ thisλŠ” ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킀고, thisλ₯Ό 톡해 ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•  수 도 μžˆλ‹€.

constructorλŠ” λ‹€λ₯Έ λ©”μ„œλ“œμ™€ κ΅¬λ³„λ˜λŠ” λͺ‡ 가지 νŠΉμ§•μ΄ μžˆλ‹€.

- constructorλŠ” λ©”μ„œλ“œλ‘œ ν•΄μ„λ˜μ§€ μ•Šκ³  ν΄λž˜μŠ€κ°€ ν‰κ°€λ˜μ–΄ μƒμ„±ν•œ ν•¨μˆ˜ 객체 μ½”λ“œμ˜ 일뢀가 λœλ‹€.
- constructorλŠ” 클래슀 내에 μ΅œλŒ€ ν•œ 개만 μ‘΄μž¬ν•  수 μžˆλ‹€.
- constructorλŠ” μƒλž΅ κ°€λŠ₯ν•˜λ‹€. μƒλž΅ν•  경우 빈 constructorκ°€ μ•”λ¬΅μ μœΌλ‘œ μ •μ˜λ˜κ³ , ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” constructor에 μ˜ν•΄ 빈 객체λ₯Ό μƒμ„±ν•œλ‹€.
- constructorλŠ” λ³„λ„μ˜ λ°˜ν™˜λ¬Έμ„ 갖지 μ•Šμ•„μ•Ό ν•œλ‹€. μ•”λ¬΅μ μœΌλ‘œ this(μΈμŠ€ν„΄μŠ€)λ₯Ό λ°˜ν™˜ν•˜λŠ” 둜직이 λ¬΄μ‹œλ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

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

μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 λ°©μ‹κ³ΌλŠ” λ‹€λ₯΄κ²Œ prototype ν”„λ‘œνΌν‹°μ— 좔가해주지 μ•Šμ•„λ„ 기본적으둜 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œκ°€ λœλ‹€.

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

ν΄λž˜μŠ€μ—μ„œλŠ” static ν‚€μ›Œλ“œλ₯Ό 뢙이면 정적 λ©”μ„œλ“œκ°€ λœλ‹€. 정적 λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— λ°”μΈλ”©λœ λ©”μ„œλ“œλ‘œ ν΄λž˜μŠ€κ°€ μ†Œμœ ν•œ ν”„λ‘œνΌν‹°κ°€ λ˜μ–΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ ν˜ΈμΆœν•  수 μžˆλ‹€.

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

> πŸ”Ž μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 정적 λ©”μ„œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” λͺ‡ 가지 차이가 μžˆλ‹€.
>
> - 호좜 방식: 정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  클래슀 μ΄λ¦„μœΌλ‘œ 직접 ν˜ΈμΆœλœλ‹€.
> - μ‚¬μš© λͺ©μ : 정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ™€ 독립적인 κΈ°λŠ₯을 μ œκ³΅ν•˜κ±°λ‚˜, ν•΄λ‹Ή ν΄λž˜μŠ€μ— κ³ μœ ν•œ κΈ°λŠ₯(헬퍼 ν•¨μˆ˜, μ„€μ • ν•¨μˆ˜)을 μ œκ³΅ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. 반면 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ˜ 데이터에 μ ‘κ·Όν•˜κ±°λ‚˜ μ‘°μž‘ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 데 주둜 μ‚¬μš©λœλ‹€.
> - this μ°Έμ‘°: 정적 λ©”μ„œλ“œμ˜ thisλŠ” 클래슀 자체λ₯Ό 가리킨닀. λ”°λΌμ„œ 정적 λ©”μ„œλ“œ λ‚΄μ—μ„œλŠ” 클래슀의 정적 속성에 μ ‘κ·Όν•  수 μžˆλ‹€. ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀. λ”°λΌμ„œ μΈμŠ€ν„΄μŠ€μ˜ 속성과 λ©”μ„œλ“œμ— μ ‘κ·Όν•  수 μžˆλ‹€.
ν‘œμ€€ 빌트인 객체인 Math, Number, JSON 등은 λ‹€μ–‘ν•œ 정적 λ©”μ„œλ“œλ₯Ό 가지고 μžˆλ‹€. μ΄λ“€μ˜ 정적 λ©”μ„œλ“œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ‘œ, 정적 λ©”μ„œλ“œμ˜ μ‚¬μš©μ˜ μ˜ˆμ‹œκ°€ λœλ‹€.

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

1. function ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•œ λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μ„ μ‚¬μš©ν•œλ‹€.
2. 객체 λ¦¬ν„°λŸ΄κ³ΌλŠ” λ‹€λ₯΄κ²Œ μ½€λ§ˆκ°€ ν•„μš” μ—†λ‹€.
3. μ•”λ¬΅μ μœΌλ‘œ strict modeκ°€ μ‹€ν–‰λœλ‹€.
4. for ...in λ¬Έμ΄λ‚˜ Object.keys λ©”μ„œλ“œ λ“±μœΌλ‘œ μ—΄κ±°ν•  수 μ—†λ‹€.
5. λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]]λ₯Ό 갖지 μ•ŠλŠ”λ‹€. λ”°λΌμ„œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•  수 μ—†λ‹€.

0 comments on commit 1b5115b

Please sign in to comment.