[๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ] - ํด๋์ค(class) ๊ธฐ๋ณธ ๋ฌธ๋ฒ
by rlaehddnd0422[๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ]๋ ์๋ ํํ ๋ฆฌ์ผ ๊ณผ์ ์ ๋ฐํ์ผ๋ก ์์ฑํ์์ต๋๋ค.
1. ํด๋์ค์ ๊ธฐ๋ณธ๋ฌธ๋ฒ
JS๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๋์ผํ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ด ๋ new function์ ํตํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์๋ ์์ต๋๋ค๋ง, JS๋ ์๋ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก class๋ผ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ
๊ธฐ๋ณธ๋ฌธ๋ฒ์ ๋น์ทํฉ๋๋ค.
class MyClass {
constructor() { ... }
method() { ... }
}
์กฐ๊ธ ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด, constructor()๋ new์ ์ํด ์๋์ผ๋ก ํธ์ถ๋์ด, ํน๋ณํ ์ ์ฐจ์์ด ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
๋ ๊ตฌ์ฒด์ ์ธ ์์๋ฅผ ์ดํด๋ด ์๋ค.
class User {
constructor(name) {
this.name = name;
}
sayHi() {
console.log(this.name);
}
}
let user = new User('user1');
user.sayHi();
// ์์ ๋์ผํ๊ฒ ๋์
function Member(name) {
this.name = name;
this.sayHi = function() {
console.log(this.name);
};
}
let user2 = new Member("ser2");
user2.sayHi();
new User('user1')์ ํธ์ถํ๋ฉด ๋จผ์ ์๋ก์ด ๊ฐ์ฒด๊ฐ ํ๋ ์์ฑ๋๊ณ ๊ทธ ์ดํ ๋๊ฒจ๋ฐ์ ์ธ์์ ํจ๊ป constructor๊ฐ ์๋์ผ๋ก ์คํ๋์ด ๊ฐ์ฒด์ name ํ๋กํผํฐ์ 'user1'์ด ํ ๋น๋ฉ๋๋ค.
์ด๋ฐ ๊ณผ์ ์ ๊ฑฐ์น ํ์ user.sayHi()๋ฅผ ํธ์ถํ ์ ์์ฃ .
๊ทธ๋์ JS์์ ํด๋์ค๊ฐ ์ ํํ ๋ฌด์์ด๋. ํด๋์ค๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์์ ํ ์ข ๋ฅ์ ๋๋ค.
console.log(typeof User); // function
์ด์ ํจ์์ ๊ด์ ์์ class์ ๋ฌธ๋ฒ๊ตฌ์กฐ๊ฐ ํ๋ ์ผ์ ์์๋ด ์๋ค.
- User๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง "ํจ์"๋ฅผ ๋ง๋ญ๋๋ค. ํจ์ ๋ณธ๋ฌธ์ ์์ฑ์ ๋ฉ์๋์ธ constructor์์ ๊ฐ์ ธ์ต๋๋ค. ๋ง์ฝ ์์ฑ์๊ฐ ์๋ค๋ฉด ๋ณธ๋ฌธ์ด ๋น์์ง์ฑ๋ก ํจ์๊ฐ ๋ง๋ค์ด์ง๋๋ค.
- sayHi ๊ฐ์ด ํด๋์ค ๋ด๋ถ์์ ์ ์๋ ๋ฉ์๋๋ฅผ User.prototype์ ์ ์ฅํฉ๋๋ค.
prototype ์ ๊ดํ ๋ด์ฉ์ ์ถํ ์์ธํ ์์๋ณผํ ๋ฐ, ์ฐ์ ์ "prototype์ ๊ฐ์ฒด ์์ฑ์ ํจ์์ ์ํด ์์ฑ๋๋ ๊ฐ์ฒด๋ค์ด ๊ณต์ ํ๋ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ฅํ๋ ํน์ ๊ฐ์ฒด" ์ ๋๋ก๋ง ๊ธฐ์ตํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
์ด์ new User๋ฅผ ํธ์ถํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด "ํจ์"์ prototype ํ๋กํผํฐ๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ฝ๋๋ก ์ค๋ช ํ์๋ฉด ์ด๋ ๊ฒ ๋ค์.
class User {
constructor(name) { this.name = name; }
sayHi() { alert(this.name); }
}
// ํด๋์ค = ํจ์
alert(typeof User); // function
// ์ ํํ๋ ์์ฑ์ ๋ฉ์๋์ ๋์ผํฉ๋๋ค.
alert(User === User.prototype.constructor); // true
// ํด๋์ค ๋ด๋ถ์์ ์ ์ํ ๋ฉ์๋๋ User.prototype์ ์ ์ฅ๋ฉ๋๋ค.
alert(User.prototype.sayHi); // alert(this.name);
// ํ์ฌ ํ๋กํ ํ์
์๋ ๋ฉ์๋๊ฐ ๋ ๊ฐ์
๋๋ค.
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi
๊ฒฐ๋ก ์ผ๋ก ๋งํ๊ณ ์ ํ๋ ๋ฐ๋ ํด๋์ค๋ ํจ์๋ผ๋ ๊ฒ์ธ๋ฐ, ์ด๋ก ์ธํด ํด๋์ค๋ฅผ ๋จ์ง '๊ฐ์ฒด'๋ฅผ ํธํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ํจ์์ "ํธ์ ๋ฌธ๋ฒ" ์ ๋์ ๋ถ๊ณผํ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค๋ง ์ฌ์ค ํด๋์ค๋ ๋จ์ ํธ์๋ฌธ๋ฒ์ ์๋๋๋ค.
function์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ class๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์๋ ์ค์ํ ๋ช๊ฐ์ง ์ฐจ์ด๊ฐ ์์ต๋๋ค.
- ๋จผ์ class๋ก ๋ง๋ ํจ์์๋ ํน์ ๋ด๋ถ ํ๋กํผํฐ์ธ IsClassConstructor(true)๊ฐ ์์ต๋๋ค. ํด๋์ค ์์ฑ์๋ฅผ new์ ํจ๊ป ํธ์ถํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ ์ด ๋ [[IsClassConstructor]]: true๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ํด๋์ค ์์ฑ์๋ฅผ ๋ฌธ์์ด๋ก ํ๋ณํํ๋ฉด 'class…'๋ก ์์ํ๋ ๋ฌธ์์ด์ด ๋๋๋ฐ ์ด๋๋ [[IsClassConstructor]]: true๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ํ ํด๋์ค์ prototype ํ๋กํผํฐ์ ์ถ๊ฐ๋ ๋ฉ์๋์ enumerable ํ๋๊ทธ๋ false์ด๊ธฐ ๋๋ฌธ์ class ์ ์ ์๋ ๋ฉ์๋๋ ์ด๊ฑฐํ ์ ์๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
- for..in์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ํํ ๋, ๋ฉ์๋๋ ์ํ ๋์์์ ์ ์ธํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก ์ด ํน์ง์ ๊ฝค ์ ์ฉํ๋ค๋๊ฑฐ.
์ด ์ธ์๋ class์ function์ ์ฐจ์ด์ ์ด ๊ฝค๋ ์์ง๋ง, ์ด ๋ด์ฉ๋ค์ ์ฐจ์ฐจ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๋น์ฅ ์ค์ํ ๋ด์ฉ์ ์๋๊ฑฐ๋ ์. ๋น์ฅ์ ๋จ์ง class๊ฐ ๋จ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ function์ ํธ์๋ฌธ๋ฒ์ ์๋๋ผ๋ ์ ์ ๊ธฐ์ตํฉ์๋ค.
'๐ Frontend > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ] - ๊ฐ์ฒด(Object) (0) | 2024.09.28 |
---|---|
[๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ] - JavaScript ๊ธฐ๋ณธ ๋ฌธ๋ฒ (7) | 2024.09.24 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422