๐ฎ 25.1 ํด๋์ค๋ ํ๋กํ ํ์ ์ ๋ฌธ๋ฒ์ ์คํ์ธ๊ฐ?
ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค๊ณ ํด์, ๊ธฐ์กด์ ํ๋กํ ํ์ ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ์ ํ์งํ๊ณ ์๋กญ๊ฒ ํด๋์ค ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ๊ฒ์ ์๋.
์ฌ์ค ํด๋์ค๋ ํจ์์ด๋ฉฐ,
๊ธฐ์กด ํ๋กํ ํ์ ๊ธฐ๋ฐ ํจํด์ ํด๋์ค ๊ธฐ๋ฐ ํจํด์ฒ๋ผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋ฌธ๋ฒ์ ์คํ์ด๋ผ๊ณ ๋ณผ ์๋ ์๋ค.
๋จ, ํด๋์ค์ ์์ฑ์ ํจ์๋ ๋ชจ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง๋ง,
๋์ผํ๊ฒ ๋์ํ์ง๋ ์๋๋ค.
ํด๋์ค๋ ์์ฑ์ ํจ์๋ณด๋ค ์๊ฒฉํ๋ฉฐ, ์์ฑ์ ํจ์์์ ์ ๊ณตํ์ง ์๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
ํด๋์ค | ์์ฑ์ ํจ์ |
new ์ฐ์ฐ์ ์์ด ํธ์ถํ๋ฉด ์๋ฌ๋จ. | new ์ฐ์ฐ์ ์์ผ๋ฉด -> ์ผ๋ฐ ํจ์๋ก ํธ์ถ |
์์์ ์ง์ํ๋ extends ์ super ํค์๋ ์ง์ | ์ง์ ์ํจ. |
ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋ ๊ฒ ์ฒ๋ผ ๋์ | ํจ์ ์ ์ธ๋ฌธ -> ํจ์ ํธ์ด์คํ
, ํจ์ ํํ์ -> ๋ณ์ ํธ์ด์คํ ๋ฐ์ |
์๋ฌต์ ์ผ๋ก strict mode ๊ฐ ์คํ๋จ. | ์ง์ ์๋จ. |
constructor, ํ๋กํ ํ์ ๋ฉ์๋, ์ ์ ๋ฉ์๋ ๋ชจ๋ -> [[Enumerable]] ๊ฐ์ด false => ์ด๊ฑฐ๋์ง ์์. |
๐ ๋จ์ํ ๋ฌธ๋ฒ์ ์คํ์ด๋ผ๊ณ ๋ณด๊ธฐ ๋ณด๋จ ์๋ก์ด ๊ฐ์ฒด ์์ฑ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ณด๋๊ฒ ํฉ๋น.
๐ฎ 25.2 ํด๋์ค ์ ์
class ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค.
ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํํ์์ผ๋ก ํด๋์ค๋ฅผ ์ ์ํ ์๋ ์๋ค.
์ด ๋ ์ด๋ฆ์ ๊ฐ์ง ์๋, ์๊ฐ์ง ์๋ ์๋ค .
const Person = class {}; //์ด๋ฆ ์๋์
const Person = class MyClass {}; // ์ด๋ฆ ์๋ ์
ํด๋์ค๋ฅผ ํํ์์ผ๋ก ์ ์ํ ์ ์๋ค?
=> ํด๋์ค๊ฐ ๊ฐ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ์ผ๊ธ ๊ฐ์ฒด ๋ผ๋ ๊ฒ.
<์ผ๊ธ ๊ฐ์ฒด๋ก์ ํด๋์ค์ ํน์ง>
- ๋ฌด๋ช ์ ๋ฆฌํฐ๋ด๋ก ์์ฑํ ์ ์๋ค. = ๋ฐํ์ ์ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
- ๋ณ์๋ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํ ์ ์๋ค.
- ํจ์์ ๋งค๊ฐ๋ณ์์ ์ ๋ฌํ ์ ์๋ค.
- ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
ํด๋์ค์ ๋ชธ์ฒด์๋ 0๊ฐ ์ด์์ ๋ฉ์๋๋ง ์ ์ํ ์ ์๋ค.
๋ฉ์๋์ ์ข ๋ฅ : construnctor(์์ฑ์), ํ๋กํ ํ์ ๋ฉ์๋, ์ ์ ๋ฉ์๋
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)
me.sayHi();
Person.sayHello()
๐ฎ 25.3 ํด๋์ค ํธ์ด์คํ
ํด๋์ค๋ ํจ์๋ก ํ๊ฐ๋จ.
ํด๋์ค ์ ์ธ๋ฌธ์ผ๋ก ์ ์ํ ํด๋์ค๋ ํจ์ ์ ์ธ๋ฌธ์ฒ๋ผ ๋ฐํ์ ์ด์ ์ ๋จผ์ ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ด๋ ํด๋์ค๊ฐ ํ๊ฐ๋์ด ์์ฑ๋ ํจ์ ๊ฐ์ฒด๋ ์์ฑ์ ํจ์๋ก์
ํธ์ถํ ์ ์๋ ํจ์, ์ฆ constructor ์ด๋ค.
๋จ, ํด๋์ค๋ ํด๋์ค ์ ์ ์ด์ ์ ์ฐธ์กฐํ ์ ์๋ค.
ํด๋์ค ์ ์ธ๋ฌธ๋ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
๋จ, let, const ํค์๋๋ก ์ ์ธํ ๋ณ์์ฒ๋ผ ํธ์ด์คํ ๋๋ค.
var, let, const, function, function*, class ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ๋ ๋ชจ๋ ์๋ณ์๋ ํธ์ด์คํ ๋๋ค.
๐ฎ 25.4 ์ธ์คํด์ค ์์ฑ
ํด๋์ค๋ ์์ฑ์ ํจ์์ด๋ฉฐ, new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋์ด ์ธ์คํด์ค๋ฅผ ์์ฑํจ.
class Person {}
const me = new Person('Lee');
console.log(me) // Person{}
ํด๋์ค๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ ์ผํ ์กด์ฌ ์ด์ .
๋ฐ๋์ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํด์ผํจ.
์ธ์คํด์ค ์์ฑ์ -> ์๋ณ์ ์ฌ์ฉํ์ง ์๊ณ , ๊ธฐ๋ช ํด๋์ค ํํ์์ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋จ.
: ํด๋์ค ํํ์์์ ์ฌ์ฉํ ํด๋์ค ์ด๋ฆ์ ์ธ๋ถ ์ฝ๋์์ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ.
๐ฎ 25.5 ๋ฉ์๋
25.5.1 construnctor
constructor ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๊ธฐ ์ํ ํน์ํ ๋ฉ์๋.
์๋ ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋ชจ๋ ํจ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ prototype ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํ๋กํ ํ์ ๊ฐ์ฒด์ constructor ํ๋กํผํฐ๋ ํด๋์ค ์์ ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
=> ํด๋์ค๊ฐ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์์ฑ์ ํจ์๋ผ๋ ๊ฒ์ ์๋ฏธ.
new ์ฐ์ฐ์์ ํจ๊ป ํด๋์ค๋ฅผ ํธ์ถํ๋ฉด ํด๋์ค๋ ์ธ์คํด์ค๋ฅผ ์์ฑํจ.
๊ทผ๋ฐ ์ด๋์๋ constructor ๋ฉ์๋๊ฐ ๋ณด์ด์ง ์์.
์ด๋ ํด๋์ค ๋ชธ์ฒด์ ์ ์ํ constructor ๊ฐ ๋จ์ํ ๋ฉ์๋๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๋ฏธ.
constructor ๋ ๋ฉ์๋๋ก ํด์๋๋ ๊ฒ์ด ์๋,
ํด๋์ค๊ฐ ํ๊ฐ๋์ด ์์ฑํ ํจ์ ๊ฐ์ฒด ์ฝ๋์ ์ผ๋ถ๊ฐ ๋จ.
ํด๋์ค ์ ์๊ฐ ํ๊ฐ๋๋ฉด, constructor์ ๊ธฐ์ ๋ ๋์์ ํ๋ ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
constuctor ๋ ์์ฑ์ ํจ์์ ์ ์ฌํ์ง๋ง ์ฐจ์ด์ ์ด ์์.
- ํด๋์ค ๋ด์ ์ต๋ 1๊ฐ๋ง ์กด์ฌํ ์ ์์ .
- ์๋ตํ ์ ์๋ค. ์๋ตํ๋ฉด ๋น constructor ๊ฐ ์๋ฌต์ ์ผ๋ก ์ ์์ฃ.
- ํ๋กํผํฐ๊ฐ ์ถ๊ฐ๋์ด ์ด๊ธฐํ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๋ฉด constructor ๋ด๋ถ์์ this ์ ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ค.
class Person {
constructor(name,address) {
this.name = name;
this.address = "Seoul"
}
}
const me = new Person("Lee", "Seoul);
์ธ์คํด์ค ์์ฑ ๋ ์ด๊ธฐ๊ฐ์ ์ ๋ฌํ๋ค.
์ธ์คํดํธ๋ฅผ ์ด๊ธฐํํ๋ ค๋ฉด constructor ๋ฅผ ์๋ตํด์๋ ์๋๋ค.
constructor ๋ ๋ณ๋์ ๋ฐํ๋ฌธ์ ๊ฐ์ง ์์์ผํจ.
=> new ์ฐ์ฐ์์ ํจ๊ป ํด๋์ค๊ฐ ํธ์ถ๋๋ฉด, ์์ฑ์ ํจ์์ ๋์ผํ๊ฒ
์๋ฌต์ ์ผ๋ก this, ์ฆ, ์ธ์คํด์ค๋ฅผ ๋ฐํํจ.
(this ์ธ์ ๋ค๋ฅธ ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ ๋ ฅํ๋ฉด ๋ฌด์๋จ, ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ์ธ์คํด์ค๊ฐ ๋ฐํ ๋ชป๋จ. ๊ฐ์ฒด๊ฐ ๋ฐํ๋จ.)
25.5.2 ํ๋กํ ํ์ ๋ฉ์๋
์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ, ๋ช ์์ ์ผ๋ก ํ๋กํ ํ์ ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
ํ์ง๋ง ํด๋์ค ๋ชธ์ฒด์ ์ ์ํ ๋ฉ์๋๋, ํด๋์ค์ prototype ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋กํ ํ์ ๋ฉ์๋๊ฐ ๋จ.
class Person {
constructor(name) {
this.name = name;
this.address = "Seoul"
}
sayHi() {
console.log(`Hi my name is ${this.name}`);
}
}
์ธ์๋ก ๋ฐ์ง ์์๊ณ this.name ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
์์ฑ์ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋์ค๊ฐ ์์ฑํ ์ธ์คํด์ค๋ ํ๋กํ ํ์ ์ฒด์ธ์ ์ผ์์ด ๋๋ค.
=> ํด๋์ค ๋ชธ์ฒด์์ ์ ์ํ ๋ฉ์๋ : ์ธ์คํดํธ์ ํ๋กํ ํ์ ์ ์กด์ฌํ๋ ํ๋กํ ํ์ ๋ฉ์๋๊ฐ ๋จ.
ํ๋กํ ํ์ ์ฒด์ธ์
๊ธฐ์กด์ ๋ชจ๋ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์ (๊ฐ์ฒด ๋ฆฌํฐ๋ด, ์์ฑ์ ํจ์, Object.create) ๋ฟ ์๋๋ผ
ํด๋์ค์ ์ํด ์์ฑ๋ ์ธ์คํด์ค์๋ ๋์ผํ๊ฒ ์ ์ฉ๋จ.
์์ฑ์ ํจ์์ ์ญํ ์ ํด๋์ค๊ฐ ํ ๋ฟ.
=> ํด๋์ค๋ ์์ฑ์ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋กํ ํ์ ๊ธฐ๋ฐ์ ๊ฐ์ฒด ์์ฑ ๋ฉ์ปค๋์ฆ ์.
25.5.3 ์ ์ ๋ฉ์๋
์ ์ ๋ฉ์๋๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ํธ์ถํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋งํจ.
์์ฑ์ ํจ์์ ๊ฒฝ์ฐ -> ์์ฑ์ ํจ์์ ๋ช ์์ ์ผ๋ก ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ผํจ.
ํด๋์ค์์๋ ๋ฉ์๋์ static ํค์๋๋ฅผ ๋ถ์ด๋ฉด ์ ์ ๋ฉ์๋(ํด๋์ค ๋ฉ์๋) ๊ฐ ๋จ.
class Person {
static sayHello() {
console.log('Hello!')
}
}
ํด๋์ค๋ ํด๋์ค ์ ์๊ฐ ํ๊ฐ๋๋ ์์ ์ ํจ์ ๊ฐ์ฒด๊ฐ ๋๋ฏ๋ก,
์ธ์คํด์ค์ ๋ฌ๋ฆฌ ๋ณ๋ค๋ฅธ ์์ฑ ๊ณผ์ ์ด ํ์๊ฐ ์์.
=> ์ ์ ๋ฉ์๋๋ ํด๋์ค ์ ์ ์ดํ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ํธ์ถํ ์ ์๋ค.
์ ์ ๋ฉ์๋๋ ์ธ์คํด์ค๋ก ํธ์ถํ์ง ์๊ณ ํด๋์ค๋ก ํธ์ถํจ!
์ ์ ๋ฉ์๋๋ ์ธ์คํด์ค๋ก ํธ์ถํ ์ ์๋ค.
์ ์ ๋ฉ์๋๊ฐ ๋ฐ์ธ๋ฉ๋ ํด๋์ค๋ ์ธ์คํด์ค์ ํ๋กํ ์์ ์ฒด์ธ ์์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ.
=> ์ธ์คํด์ค์ ํ๋กํ ํ์ ์ฒด์ธ ์์๋ ํด๋์ค๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ก ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ๋ฐ์ ์ ์์.
(๋ณต์ ๊ฐ ์๋จ)
25.5.4 ์ ์ ๋ฉ์๋์ ํ๋กํ ๋ฉ์๋์ ์ฐจ์ด
1. ์ํด์๋ ํ๋กํ ํ์ ์ฒด์ธ์ด ๋ค๋ฆ.
2. ์ ์ ๋ฉ์๋ : ํด๋์ค๋ก ํธ์ถ / ํ๋กํ ํ์ ๋ฉ์๋ : ์ธ์คํด์ค๋ก ํธ์ถ
3. ์ ์ ๋ฉ์๋ : ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ์ โ / ํ๋กํ ํ์ ๋ฉ์๋ : ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ์ โญ
์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค๋ฉด ์ ์ ๋ฉ์๋ ๋์ ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ ์ ๋ฉ์๋๋ ํด๋์ค๋ก ํธ์ถํด์ผํจ -> ์ ์ ๋ฉ์๋ ๋ด๋ถ์ this : ํด๋์ค๋ฅผ ๊ฐ๋ฆฌํด (์ธ์คํด์ค ์๋.)
์ฆ, ํ๋กํ ํ์ ๋ฉ์๋์ ์ ์ ๋ฉ์๋ ๋ด๋ถ์ this ๋ฐ์ธ๋ฉ์ด ๋ค๋ฆ.
=>
๋ฉ์๋ ๋ด๋ถ์์ ์ธ์คํด์ค ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ํ์๊ฐ ์๋ค๋ฉด this ๋ฅผ ์ฌ์ฉํด์ผํ๋ฉฐ,
์ด ๊ฒฝ์ฐ ํ๋กํ ํ์ ๋ฉ์๋๋ก ์ ์ํด์ผํจ.
this ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋๋ ์ ์ ๋ฉ์๋๋ก ์ ์ํ๋ ๊ฒ์ด ์ข๋ค.
Math, Number, JSON, Object, reflect ๋ฑ์ ๋ค์ํ ์ ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
-> ์๋ค์ ์ ์ ๋ฉ์๋๋ ์ ์ญ์์ ์ฌ์ฉํ๋ ์ ํธ๋ฆฌํฐ ํจ์. (์ธ์คํด์ค์ ์๊ด์์ด ์ฌ์ฉ)
์๋ค์ฒ๋ผ ์ ์ ๋ฉ์๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ฌ์ฉํ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ๋ฉ์๋๋ก ๊ตฌ์กฐํํ ๋ ์ ์ฉํจ.
25.5.5 ํด๋์ค์์ ์ ์ํ ๋ฉ์๋์ ํน์ง
1. function ํค์๋๋ฅผ ์๋ตํ ๋ฉ์๋ ์ถ์ฝ ํํ ์ฌ์ฉ
2. ๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ๋ ๋ค๋ฅด๊ฒ ์ ์ํ ๋ ์ฝค๋ง๊ฐ ํ์ ์์.
3. ์๋ฌต์ ์ผ๋ก strict mode ๋ก ์คํ๋จ.
4. ์ด๊ฑฐ ๋ถ๊ฐ. [[Enumerable]] ์ ๊ฐ์ด false
5. new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ ํ ์ ์์.
๐ฎ 25.6 ํด๋์ค์ ์ธ์คํด์ค ์์ฑ ๊ณผ์
1. ์ธ์คํด์ค ์์ฑ๊ณผ this ๋ฐ์ธ๋ฉ.
new ์ฐ์ฐ์์ ํจ๊ป ํด๋์ค ํธ์ถ -> ์๋ฌต์ ์ผ๋ก ๋น ๊ฐ์ฒด ์์ฑ. (ํด๋์ค๊ฐ ์์ฑํ ์ธ์คํด์ค)
-> ์ด ๋น ๊ฐ์ฒด์ธ ์ธ์คํด์ค๋ this ์ ๋ฐ์ธ๋ฉ๋จ. -> constructor ๋ด๋ถ์ this => ํด๋์ค๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด.
2. ์ธ์คํด์ค ์ด๊ธฐํ
constructor ๋ด๋ถ ์ฝ๋ ์คํ -> this ์ ๋ฐ์ธ๋ฉ ๋ ์ธ์คํด์ค ์ด๊ธฐํํจ.
3. ์ธ์คํด์ค ๋ฐํ
ํด๋์ค์ ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด, ์์ฑ๋ ์ธ์คํด์ค๊ฐ ๋ฐ์ธ๋ฉ๋ this => ์๋ฌต์ ์ผ๋ก ๋ฐํ๋จ.
'๋ ์ ๋ชฉ๋ก > ๋ชจ๋ฅ๋ค Modern JS Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ชจ๋ฅ๋ค] 27์ฅ ๋ฐฐ์ด (0) | 2023.05.21 |
---|---|
[๋ชจ๋ฅ๋ค] 26์ฅ ES6 ํจ์์ ์ถ๊ฐ ๊ธฐ๋ฅ (0) | 2023.05.21 |
[๋ชจ๋ฅ๋ค] 24์ฅ ํด๋ก์ (0) | 2023.05.16 |
[๋ชจ๋ฅ๋ค] 23์ฅ ์คํ ์ปจํ ์คํธ (0) | 2023.05.16 |
[๋ชจ๋ฅ๋ค] 22์ฅ this (0) | 2023.05.14 |