-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1021 from wuzoo/wuzoo2
25-1μ₯ ν΄λμ€ - μ΅μ£Όμ©
- Loading branch information
Showing
1 changed file
with
302 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,302 @@ | ||
# π 25μ₯ ν΄λμ€ | ||
|
||
**TIL κΈ°λ‘μΌ** : 2023.12.19 (25.1 ~ 25.5) | ||
|
||
## λͺ©μ°¨ | ||
|
||
[1. ν΄λμ€λ νλ‘ν νμ μ λ¬Έλ²μ μ€νμΈκ°?](#-251-ν΄λμ€λ-νλ‘ν νμ μ-λ¬Έλ²μ -μ€νμΈκ°) | ||
[2. ν΄λμ€ μ μ](#-252-ν΄λμ€-μ μ) | ||
[3. ν΄λμ€ νΈμ΄μ€ν ](#-253-ν΄λμ€-νΈμ΄μ€ν ) | ||
[4. μΈμ€ν΄μ€ μμ±](#-254-μΈμ€ν΄μ€-μμ±) | ||
[5. λ©μλ](#-255-λ©μλ) | ||
|
||
## π 25.1 ν΄λμ€λ νλ‘ν νμ μ λ¬Έλ²μ μ€νμΈκ°? | ||
|
||
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄μ΄λ€. | ||
|
||
νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄λ ν΄λμ€κ° νμμλ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄λ€. | ||
|
||
```javascript | ||
// ES5 μμ±μ ν¨μ | ||
var Person = (function () { | ||
function Person(name) { | ||
this.name = name; | ||
} | ||
|
||
// νλ‘ν νμ λ©μλ | ||
Person.prototype.sayHi = function () { | ||
console.log(`Hi! My name is ` + this.name); | ||
}; | ||
|
||
// μμ±μ ν¨μ λ°ν | ||
return Person; | ||
})(); | ||
|
||
var me = new Person("Lee"); | ||
me.sayHi(); // Hi! My name is Lee | ||
``` | ||
|
||
ES6μ λμ λ ν΄λμ€λ κΈ°μ‘΄ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°λ³΄λ€ μλ°λ C#κ³Ό κ°μ ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄μ λ§€μ° ν‘μ¬ν μλ‘μ΄ κ°μ²΄ μμ± λ§€μ»€λμ¦μ μ μνλ€. | ||
|
||
κ·Έλ λ€κ³ ES6μ ν΄λμ€κ° κΈ°μ‘΄μ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ λͺ¨λΈμ νμ§νλ κ²μ μλλ€. μ¬μ€ ν΄λμ€λ ν¨μμ΄λ©° κΈ°μ‘΄ νλ‘ν νμ κΈ°λ° ν¨ν΄μ ν΄λμ€ κΈ°λ° ν¨ν΄μ²λΌ μ¬μ©ν μ μλλ‘ νλ λ¬Έλ²μ μ€ν<sup>syntactic sugar</sup> μ΄λΌκ³ λ³Ό μλ μλ€. | ||
|
||
ν΄λμ€μ μμ±μ ν¨μ λͺ¨λ νλ‘ν νμ κΈ°λ°μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§λ§, ν΄λμ€λ λμ± μ격νλ©° μμ±μ ν¨μμμλ μ 곡νμ§ μλ κΈ°λ₯λ μ 곡νλ€. | ||
|
||
1. ν΄λμ€λ₯Ό `new` μ°μ°μ μμ΄ νΈμΆνλ©΄ μλ¬κ° λ°μνλ€. | ||
|
||
2. ν΄λμ€λ μμμ μ§μνλ `extends`μ `super` ν€μλλ₯Ό μ 곡νλ€. | ||
|
||
3. ν΄λμ€λ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ λμνλ€. νμ§λ§ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ μμ±μ ν¨μλ ν¨μ νΈμ΄μ€ν μ΄, ν¨μ ννμμΌλ‘ μ μν μμ±μ ν¨μλ λ³μ νΈμ΄μ€ν μ΄ λ°μνλ€. | ||
|
||
4. ν΄λμ€ λ΄μ λͺ¨λ μ½λμλ μ묡μ μΌλ‘ `strict mode`κ° μ§μ λμ΄ μ€νλλ©° strict modeλ₯Ό ν΄μ ν μ μλ€. | ||
|
||
5. ν΄λμ€μ `constructor`, νλ‘ν νμ λ©μλ, μ μ λ©μλλ λͺ¨λ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ [[Enumerable]]μ κ°μ΄ falseλ€. λ€μ λ§ν΄, μ΄κ±°λμ§ μλλ€. | ||
|
||
μ΄μ κ°μ΄ ν΄λμ€λ μμ±μ ν¨μ κΈ°λ°μ κ°μ²΄ μμ± λ°©μλ³΄λ€ κ²¬κ³ νκ³ λͺ λ£νλ€. λ°λΌμ λ¬Έλ²μ μ€νμ΄λΌκ³ 보기보λ€λ **μλ‘μ΄ κ°μ²΄ μμ± λ§€μ»€λμ¦**μ΄λΌ 보λ κ²μ΄ μ’ λ ν©λΉνλ€. | ||
|
||
## π 25.2 ν΄λμ€ μ μ | ||
|
||
ν΄λμ€λ `class` ν€μλλ₯Ό μ¬μ©νμ¬ μ μνλ€. ν΄λμ€ μ΄λ¦μ μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ νμ€μΉΌ μΌμ΄μ€λ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μ΄λ€. | ||
|
||
ν΄λμ€λ ν¨μμ λ§μ°¬κ°μ§λ‘ ννμμΌλ‘ μ μν μ μμΌλ©°, μ΄λ ν΄λμ€κ° κ°μΌλ‘ μ¬μ©ν μ μλ μΌκΈ κ°μ²΄λΌλ κ²μ μλ―Ένλ€. λ°λΌμ λ€μκ³Ό κ°μ νΉμ§μ κ°λλ€. | ||
|
||
- 무λͺ μ 리ν°λ΄λ‘ μμ±ν μ μλ€. μ¦ λ°νμμ μμ±μ΄ κ°λ₯νλ€. | ||
|
||
- λ³μλ μλ£κ΅¬μ‘°μ μ μ₯ κ°λ₯νλ€.. | ||
|
||
- ν¨μμ 맀κ°λ³μλ‘ μ λ¬ν μ μλ€. | ||
|
||
- ν¨μμ λ°νκ°μΌλ‘ μ¬μ©ν μ μλ€. | ||
|
||
--- | ||
|
||
ν΄λμ€ λͺΈμ²΄μμ μ μν μ μλ λ©μλλ `constructor`(μμ±μ), νλ‘ν νμ λ©μλ, μ μ λ©μλ μΈ κ°μ§κ° μλ€. | ||
|
||
```javascript | ||
class Person { | ||
// μμ±μ | ||
constructor(name) { | ||
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν | ||
this.name = name; | ||
} | ||
|
||
// νλ‘ν νμ λ©μλ | ||
sayHi() { | ||
console.log(`Hi! My name is ${this.name}`); | ||
} | ||
|
||
// μ μ λ©μλ | ||
static sayHello() { | ||
console.log("Hello!"); | ||
} | ||
} | ||
|
||
const me = new Person("Lee"); | ||
|
||
// μΈμ€ν΄μ€μ νλ‘νΌν° μ°Έμ‘° | ||
console.log(me.name); // Lee | ||
// νλ‘ν νμ λ©μλ νΈμΆ | ||
me.sayHi(); // Hi! My name is Lee | ||
// μ μ λ©μλ νΈμΆ | ||
Person.sayHello(); // Hello! | ||
``` | ||
|
||
ν΄λμ€μ μμ±μ ν¨μμ μ μ λ°©μμ λΉκ΅νλ©΄ λ€μκ³Ό κ°λ€. | ||
|
||
![](https://velog.velcdn.com/images/wuzoo/post/684b6601-b86b-4a93-b7cc-3927e934a822/image.png) | ||
|
||
## π 25.3 ν΄λμ€ νΈμ΄μ€ν | ||
|
||
ν΄λμ€λ ν¨μλ‘ νκ°λλ€. | ||
|
||
```javascript | ||
class Person {} | ||
|
||
console.log(typeof Person); // function | ||
``` | ||
|
||
ν΄λμ€ μ μΈλ¬ΈμΌλ‘ μ μν ν΄λμ€λ ν¨μ μ μΈλ¬Έκ³Ό κ°μ΄ μμ€μ½λ νκ° κ³Όμ , μ¦ λ°νμ μ΄μ μ λ¨Όμ νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ€. μ΄λ ν΄λμ€κ° νκ°λμ΄ μμ±λ ν¨μ κ°μ²΄λ μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦ constructorμ΄λ€. | ||
|
||
ν΄λμ€ μ μΈλ¬Έμ λ§μΉ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ 보μ΄λ κ·Έλ μ§ μλ€. | ||
|
||
```javascript | ||
const Person = ""; | ||
|
||
{ | ||
// νΈμ΄μ€ν μ΄ λ°μνμ§ μλλ€λ©΄ ''μ΄ μΆλ ₯λμ΄μΌ νλ€. | ||
console.log(Person); | ||
// Reference: Cannot access 'Person' before initialization | ||
|
||
// ν΄λμ€ μ μΈλ¬Έ | ||
class Person {} | ||
} | ||
``` | ||
|
||
λ³μ νΈμ΄μ€ν μ΄ λ°μνμ§ μλλ€λ©΄ ν΄λΉ μ€μ½νμ `Person` μλ³μκ° λ±λ‘λμ§ μμμΌλ―λ‘ μ μ λ³μμ Personμ μΆλ ₯νκ² μ§λ§, ν΄λμ€ μ μΈλ¬Έμ΄ νΈμ΄μ€ν μ΄ λ°μνμ¬ μμ§ μ΄κΈ°νλμ§ μμλ€λ **"μΌμμ μ¬κ°μ§λ"**λ₯Ό μλ―Ένλ λ¬Έκ΅¬κ° μΆλ ₯λλ€. | ||
|
||
var, let, const, function, class ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈλ λͺ¨λ μλ³μλ νΈμ΄μ€ν λλ€. | ||
|
||
## π 25.4 μΈμ€ν΄μ€ μμ± | ||
|
||
ν΄λμ€λ μμ±μ ν¨μμ΄λ©° νμ `new` μ°μ°μμ ν¨κ» νΈμΆλμ΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ€. | ||
|
||
```javascript | ||
class Person {} | ||
|
||
// μΈμ€ν΄μ€ μμ± | ||
const me = new Person(); | ||
console.log(me); // Person {} | ||
``` | ||
|
||
ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ΄ μ μΌν μ‘΄μ¬ μ΄μ μ΄λ―λ‘, `new` μ°μ°μμ ν¨κ» νΈμΆνμ§ μμΌλ©΄ μλ¬κ° λ°μνλ€. | ||
|
||
```javascript | ||
class Person {} | ||
|
||
const me = Person(); | ||
// TypeError: Class constructor Person cannot be invoked without 'new' | ||
``` | ||
|
||
## π 25.5 λ©μλ | ||
|
||
### 25.5.1 constructor | ||
|
||
`constructor`λ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ΄κΈ°ννκΈ° μν νΉμν λ©μλλ€. constructorλ μ΄λ¦μ λ³κ²½ν μ μλ€. | ||
|
||
```javascript | ||
class Person { | ||
// μμ±μ | ||
constructor(name) { | ||
this.name = name; | ||
} | ||
} | ||
``` | ||
|
||
ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ λ΄λΆλ₯Ό λ€μ¬λ€λ³΄μ. | ||
|
||
```javascript | ||
// μΈμ€ν΄μ€ μμ± | ||
const me = new Person("Lee"); | ||
console.log(me); | ||
``` | ||
|
||
![](https://velog.velcdn.com/images/wuzoo/post/25f04bf1-4a02-46e1-b5da-37fa9de3973f/image.png) | ||
|
||
Person ν΄λμ€μ constructor λ΄λΆμμ thisμ μΆκ°ν name νλ‘νΌν°κ° ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ νλ‘νΌν°λ‘ μΆκ°λ κ²μ νμΈν μ μλ€. μ¦, μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ constructor λ΄λΆμμ thisμ μΆκ°ν νλ‘νΌν°λ μΈμ€ν΄μ€ νλ‘νΌν°κ° λλ€. constructor λ΄λΆμ thisλ μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€. | ||
|
||
μΈμ€ν΄μ€λ₯Ό μμ±ν λ ν΄λμ€ μΈλΆμμ μΈμ€ν΄μ€ νλ‘νΌν°μ μ΄κΈ°κ°μ μ λ¬νλ €λ©΄ λ€μκ³Ό κ°μ΄ `constructor`μ 맀κ°λ³μλ₯Ό μ μΈνκ³ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μ΄κΈ°κ°μ μ λ¬νλ€. μ΄λ μ΄κΈ°κ°μ constructorμ 맀κ°λ³μμκ² μ λ¬λλ€. | ||
|
||
### 25.5.2 νλ‘ν νμ λ©μλ | ||
|
||
ν΄λμ€ λͺΈμ²΄μ μ μν λ©μλλ μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μκ³Όλ λ€λ₯΄κ² ν΄λμ€μ `prototype` νλ‘νΌν°μ λ©μλλ₯Ό μΆκ°νμ§ μμλ κΈ°λ³Έμ μΌλ‘ νλ‘ν νμ λ©μλκ° λλ€. | ||
|
||
```javascript | ||
class Person { | ||
// μμ±μ | ||
constructor(name) { | ||
this.name = name; | ||
} | ||
|
||
// νλ‘ν νμ λ©μλ | ||
sayHi() { | ||
console.log(`Hi! My name is ${this.name}`); | ||
} | ||
} | ||
|
||
const me = new Person("Lee"); | ||
me.sayHi(); // Hi! My name is Lee | ||
``` | ||
|
||
### 25.5.3 μ μ λ©μλ | ||
|
||
μ μ <sup>static</sup> λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ νΈμΆν μ μλ λ©μλλ₯Ό λ§νλ€. | ||
|
||
μμ±μ ν¨μμ κ²½μ° μ μ λ©μλλ₯Ό μμ±νκΈ° μν΄μλ λ€μκ³Ό κ°μ΄ λͺ μμ μΌλ‘ μμ±μ ν¨μμ λ©μλλ₯Ό μΆκ°ν΄μΌ νλ€. | ||
|
||
```javascript | ||
// μμ±μ ν¨μ | ||
function Person(name) { | ||
this.name = name; | ||
} | ||
|
||
// μ μ λ©μλ | ||
Person.sayHi = function () { | ||
console.log("Hi!"); | ||
}; | ||
|
||
Person.sayHi(); // Hi! | ||
``` | ||
|
||
ν΄λμ€μμλ λ©μλμ `static` ν€μλλ₯Ό λΆμ΄λ©΄ μ μ λ©μλκ° λλ€. | ||
|
||
```javascript | ||
class Person { | ||
// ... | ||
static sayHi() { | ||
console.log("Hi"); | ||
} | ||
} | ||
``` | ||
|
||
μ μ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆν μ μλ€. μΈμ€ν΄μ€μ νλ‘ν νμ μ²΄μΈ μμλ ν΄λμ€κ° μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ μΈμ€ν΄μ€λ‘ ν΄λμ€μ λ©μλλ₯Ό μμλ°μ μ μλ€. | ||
|
||
```javascript | ||
// μΈμ€ν΄μ€ μμ± | ||
const me = new Person("Lee"); | ||
me.sayHi(); // TypeError: me.sayHi is not a function | ||
``` | ||
|
||
### 25.5.4 μ μ λ©μλμ νλ‘ν νμ λ©μλμ μ°¨μ΄ | ||
|
||
λ λ©μλμ μ°¨μ΄λ λ€μκ³Ό κ°λ€. | ||
|
||
1. μ μ λ©μλμ νλ‘ν νμ λ©μλλ μμ μ΄ μν΄ μλ νλ‘ν νμ 체μΈμ΄ λ€λ₯΄λ€. | ||
2. μ μ λ©μλλ ν΄λμ€λ‘ νΈμΆνκ³ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆνλ€. | ||
3. μ μ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν μ μμ§λ§ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν μ μλ€. | ||
|
||
```javascript | ||
class Square { | ||
// μ μ λ©μλ | ||
static area(width, height) { | ||
return width * height; | ||
} | ||
} | ||
|
||
console.log(Square.area(10, 10)); // 100 | ||
``` | ||
|
||
μ μ λ©μλ areaλ 2κ°μ μΈμλ₯Ό μ λ¬λ°μ λ©΄μ μ κ³μ°νλ€. μ΄λ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°νμ§ μλλ€. λ§μ½ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν΄μΌ νλ€λ©΄ νλ‘ν νμ λ©μλλ₯Ό μ¬μ©ν΄μΌ νλ€. | ||
|
||
```javascript | ||
class Square { | ||
constructor(width, height) { | ||
this.width = width; | ||
this.height = height; | ||
} | ||
|
||
// νλ‘ν νμ λ©μλ | ||
area() { | ||
return this.width * this.height; | ||
} | ||
} | ||
|
||
const square = new Square(10, 10); | ||
console.log(square.area()); // 100 | ||
``` | ||
|
||
22μ "ν¨μ νΈμΆ λ°©μκ³Ό this λ°μΈλ©"μμ μ΄ν΄λ³΄μλ―μ΄ λ©μλ λ΄λΆμ `this`λ λ©μλλ₯Ό μμ ν κ°μ²΄κ° μλ λ©μλλ₯Ό νΈμΆν κ°μ²΄, μ¦ λ©μλ μ΄λ¦ μμ λ§μΉ¨ν(.) μ°μ°μ μμ κΈ°μ ν κ°μ²΄μ λ°μΈλ©λλ€. | ||
|
||
μ μμ μ κ²½μ° `square` κ°μ²΄λ‘ νλ‘ν νμ λ©μλ `area`λ₯Ό νΈμΆνκΈ° λλ¬Έμ area λ΄λΆμ thisλ square κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. | ||
|
||
μ μ λ©μλλ ν΄λμ€λ‘ νΈμΆν΄μΌ νλ―λ‘ μ μ λ©μλ λ΄λΆμ thisλ μΈμ€ν΄μ€κ° μλ ν΄λμ€λ₯Ό κ°λ¦¬ν¨λ€. μ¦, νλ‘ν νμ λ©μλμ μ μ λ©μλ λ΄λΆμ this λ°μΈλ©μ΄ λ€λ₯΄λ€. | ||
|
||
λ©μλ λ΄λΆμμ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν νμκ° μλ€λ©΄ `this`λ₯Ό μ¬μ©ν΄μΌ νλ―λ‘ νλ‘ν νμ λ©μλλ₯Ό μ¬μ©ν΄μΌ νμ§λ§, μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν΄μΌ ν νμκ° μλ€λ©΄ thisλ₯Ό μ¬μ©νμ§ μκ² λλ€. | ||
λ°λΌμ thisλ₯Ό μ¬μ©νμ§ μλλ€λ©΄ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±ν ν μΈμ€ν΄μ€λ‘ νΈμΆν΄μΌ νλ―λ‘ thisλ₯Ό μ¬μ©νμ§ μλ μ μ λ©μλλ‘ μ μνλ κ²μ΄ μ’λ€. | ||
|
||
### 25.5.5 ν΄λμ€μμ μ μν λ©μλμ νΉμ§ | ||
|
||
1. `function` ν€μλλ₯Ό μλ΅ν λ©μλ μΆμ½ ννμ μ¬μ©νλ€. | ||
2. κ°μ²΄ 리ν°λ΄κ³Όλ λ€λ₯΄κ² ν΄λμ€μ λ©μλλ₯Ό μ μν λλ μ½€λ§(,)κ° νμ μλ€. | ||
3. μ묡μ μΌλ‘ `strict mode`λ‘ μ€νλλ€. | ||
4. `for ... in`λ¬Έμ΄λ `Object.keys` λ©μλ λ±μΌλ‘ μ΄κ±°ν μ μλ€. μ¦, νλ‘νΌν°μ μ΄κ±°κ° λΆκ°λ₯νλ©° νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ [[Enumerable]]μ κ°μ΄ falseλ€. | ||
5. λ΄λΆ λ©μλλ [[Constructor]]λ₯Ό κ°μ§ μλ non-constructorλ€. λ°λΌμ `new` μ°μ°μμ ν¨κ» νΈμΆν μ μλ€. |