16์ฅ ~ 18์ฅ ์ ์ฝ์ผ๋ฉฐ
๊ฐ์ฒด๊ฐ JS ์ ๊ธฐ๋ฐ์ด๋ผ ์ค์ํ ๊ฑฐ ์๊ฒ ๋๋ฐ,
์ฐ๋ฆฌ๊ฐ ์ค์ง์ ์ผ๋ก ์ด๋์ ํ๋กํ ํ์ ์ ์ธ ์ ์๋ค๋๊ฑฐ์ง..? ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ด๋์ ์จ๋จน์ง..? ๋ฑ์ ์๋ฌธ์ด ๋ค์๋ค.
์๋ฌธ์ด ๋ค๊ธด ํ์ผ๋,
๋ค์์ ์๋ ค์ฃผ์ง ์์๊น? & ์ฐ์ ์คํฐํฐ ์ง๋๋ถํฐ ๋๊ฐ์! ๋ผ๋ ์๊ฐ์ ์ฐพ์๋ณผ ์๊ฐ์ ์ํ์๋ค.
๋ชจ๋ฅ๋ค ์คํฐ๋ ์ค๋ ๋์ ์ฌ๋ผ์จ ์ง๋ฌธ
๊ทธ๋ฅด๊ฒ์ฉ
์ด๋ ๊ฒ ์์ฌ์ด ๋ถ๋ถ์ ๋ํด ์ด์ผ๊ธฐ๊ฐ ๋์๋ค.
GPT ํํ ๋ฌผ์ด๋ณผ๊น๋ ์๊ฐ์ด ๋ถํ๋ฏ ๋ค์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํ๋กํ ํ์ (Prototype)์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋ ์ค ํ๋์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด์งํฅ ์ธ์ด์ด๋ฉฐ, ๋ชจ๋ ๊ฐ์ฒด๋ ํ๋กํ ํ์ ์ ๊ฐ์ง๋๋ค. ์ด ํ๋กํ ํ์ ์ ํด๋น ๊ฐ์ฒด์ ๊ธฐ๋ฅ๊ณผ ์์ฑ์ ์ ์ํฉ๋๋ค. ํ๋กํ ํ์ ์ ๊ฐ์ฒด ๊ฐ์ ์์์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฒด๋ ์์ ์ ํ๋กํ ํ์ ์์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์ํ๊ณ , ํ๋กํ ํ์ ์ ๋ค๋ฅธ ํ๋กํ ํ์ ์์ ์์๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ํ ์์ ๊ฐ๋ ์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๊ตฌํํ ์ ์๋๋ก ํด์ค๋๋ค. ๋ํ, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๋ ๊ฐ์ฒด์ด๋ฉฐ, ํจ์ ์ญ์ ํ๋กํ ํ์ ์ ๊ฐ์ง๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ํจ์๋ฅผ ์์ฑ์๋ก ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋, ํ๋กํ ํ์ ์ฒด์ธ์ ์ด์ฉํ์ฌ ํจ์์์ ์์์ ๋ฐ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋๋ก ์ดํดํ๊ณ ํ์ฉํ๊ธฐ ์ํด์๋ ํ๋กํ ํ์ ์ ๋ํ ์ดํด๊ฐ ํ์์ ์ ๋๋ค.
ํ ..
์ด ๊ธ์ ์คํฐ๋์ ์ค ํ ๋ถ์ด ๋ณด๋ด์ฃผ์ จ๊ณ ,
์ด๋ ต์ง๋ง ์ฌ๋ฐ๊ฒ ์ฝ์๋ค.
ํ์ค์ ์กด์ฌํ๋ ๊ฒ ์ค ๊ฐ์ฅ ์ข์ ๋ณธ๋ณด๊ธฐ๋ฅผ ์ํ(prototype)์ผ๋ก ์ ํํ๋ค.
๋ฌธ๋งฅ(์ปจํ ์คํธ)์ ๋ฐ๋ผ ‘๋ฒ์ฃผ’, ์ฆ ‘์๋ฏธ’๊ฐ ๋ฌ๋ผ์ง๋ค.
...
ํ๋กํ ํ์ ์ธ์ด์์๋ ‘๋ถ๋ฅ’๋ฅผ ์ฐ์ ํ์ง ์๋๋ค. ์์ฑ๋ ๊ฐ์ฒด ์์ฃผ๋ก ์ ์ฌ์ฑ์ ์ ์ํ๋ค.
์ดํ, ์ฐ์์๋ ๋งฅ๋ฝ(context)์ ์ํด ํ๊ฐ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ ๊ทธ ๊ฐ๋ ์ด ์กฐ๊ธ ๋ ์๋ฟ์๋ค.
๊ฒฐ๊ตญ ๊ณตํต๋๋ ๊ฐ์ฅ ์์ ๋ถ๋ถ์ ์ฌ์ฌ์ฉ ํ๊ธฐ ์ํ ๊ฒ์ด๊ณ ,
์ฌ์ฌ์ฉ์ ํ๋ ๋ฐฉ๋ฒ๋ค์ด ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ ๊ฑฐ๋ผ ์ดํดํ๋ค.
์๋๋ ๋ ๋ค๋ฅธ ์์๋ก ๋ณด๋ด์ฃผ์ ๊ธ๊ท.
์์๋ฅผ ๋ณด๋ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์กฐ๊ธ๋ ์๋ฟ๋ ๋๋์ด๋ค.
function Person(name, age) {
this.name = name;
this.age = age;
}
const person1 = new Person("Alice", 30);
const person2 = new Person("Bob", 25);
2. ์์ฑ์ ํจ์์ ํ๋กํ ํ์
๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด ๋ฉ์๋๋ ๋ชจ๋ Person ๊ฐ์ฒด๊ฐ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค.
Person.prototype.introduce = function () {
console.log(`์๋
ํ์ธ์! ์ ๋ ${this.name}์ด๊ณ , ๋์ด๋ ${this.age}์ด์
๋๋ค.`);
};
person1.introduce(); // ์๋
ํ์ธ์! ์ ๋ Alice์ด๊ณ , ๋์ด๋ 30์ด์
๋๋ค.
person2.introduce(); // ์๋
ํ์ธ์! ์ ๋ Bob์ด๊ณ , ๋์ด๋ 25์ด์
๋๋ค.
ํ๋กํ ํ์
์ ์ฌ์ฉํ๋ฉด, introduce ๋ฉ์๋์ ๊ฐ์ ๊ณตํต ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ณต์ ํ ์ ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค. ๋ง์ฝ ํ๋กํ ํ์
์ ์ฌ์ฉํ์ง ์๊ณ ๋ฉ์๋๋ฅผ ๊ฐ ๊ฐ์ฒด์ ์ง์ ์ถ๊ฐํ๋ค๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. 3. ํ๋กํ ํ์
์ฒด์ธ์ ํตํ ์์ ๊ตฌํ
function Employee(name, age, position) {
Person.call(this, name, age);
this.position = position;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.introduce = function () {
Person.prototype.introduce.call(this);
console.log(`์ ์ง์ฑ
์ ${this.position}์
๋๋ค.`);
};
const employee1 = new Employee("Charlie", 40, "๊ฐ๋ฐ์");
employee1.introduce();
// ์๋
ํ์ธ์! ์ ๋ Charlie์ด๊ณ , ๋์ด๋ 40์ด์
๋๋ค.
// ์ ์ง์ฑ
์ ๊ฐ๋ฐ์์
๋๋ค.
์ ์์์์ Employee ์์ฑ์ ํจ์๋ Person์ ํ๋กํ ํ์
์ ์์๋ฐ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ์์์ ๊ตฌํํ ์ ์์ต๋๋ค. ํ๋กํ ํ์
์ ๊ณต๋ถํ๋ ์ด์ ๋ ์ด๋ฌํ ์ฅ์ ๋ค ๋๋ฌธ์
๋๋ค. ํ๋กํ ํ์
์ ์ดํดํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ, ํ๋กํ ํ์
์ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ ๋ค์ํ ์์
์ ์ํํ ์ ์์ต๋๋ค. 1. ๊ธฐ์กด ๊ฐ์ฒด์ ์๋ก์ด ๋ฉ์๋ ์ถ๊ฐ:
Person.prototype.sayGoodbye = function () {
console.log(`${this.name}์ด(๊ฐ) ์๋
ํ ๊ณ์ธ์! ๋ผ๊ณ ์ธ์ฌํฉ๋๋ค.`);
};
person1.sayGoodbye(); // Alice์ด(๊ฐ) ์๋
ํ ๊ณ์ธ์! ๋ผ๊ณ ์ธ์ฌํฉ๋๋ค.
2. ํ๋กํ ํ์
์ ํตํด ๊ธฐ์กด ๋ฉ์๋๋ฅผ ์์ ํ๊ฑฐ๋ ๋ฎ์ด์ฐ๊ธฐ:
Person.prototype.introduce = function () {
console.log(`์๋
ํ์ธ์! ์ ์ด๋ฆ์ ${this.name}์ด๊ณ , ์ ๋์ด๋ ${this.age}์ด์
๋๋ค.`);
};
person1.introduce(); // ์๋
ํ์ธ์! ์ ์ด๋ฆ์ Alice์ด๊ณ , ์ ๋์ด๋ 30์ด์
๋๋ค.
function Student(name, age, major) {
Person.call(this, name, age);
this.major = major;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.introduce = function () {
Person.prototype.introduce.call(this);
console.log(`์ ๊ณต์ ${this.major}์
๋๋ค.`);
};
const student1 = new Student("David", 22, "์ปดํจํฐ ๊ณตํ");
student1.introduce();
// ์๋
ํ์ธ์! ์ ์ด๋ฆ์ David์ด๊ณ , ์ ๋์ด๋ 22์ด์
๋๋ค.
// ์ ๊ณต์ ์ปดํจํฐ ๊ณตํ์
๋๋ค.
์ด์ฒ๋ผ ํ๋กํ ํ์
์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด ์ํธ ์์ฉ๊ณผ ์์์ ๊ตฌํํ๋ ๋ฐ ํ์์ ์ธ ์ญํ ์ ํฉ๋๋ค. ํ๋กํ ํ์
์ ์ดํดํ๋ฉด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ์ฑ๋ฅ์ ์ต์ ํํ๋ฉฐ, ๋์ฑ ์ฒด๊ณ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ํ๋กํ ํ์
์ ๊ณต๋ถํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ด๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ ๊น์ด ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฐ์ ์ดํดํ ๋งํผ๋ง ๊ฒฐ๋ก ์ ๋ด๋ ค๋ณด๋ฉด, (๋ถ๋ช ์์ ํ๋ฌ ์ฌ ๋ฏ)
๊ฒฐ๋ก :
ํ๋กํ ํ์ ์ ์ฝ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ด๊ณ , ์ด๊ฑธ ๋ฒ ์ด์ค๋ก ํ๋๊ฒ JS ์ ๊ธฐ๋ฐ์ธ ๊ฐ์ฒด๋ค. ์ด ๊ฐ์ฒด์ ๋ด๋ถ์ ์ธ ๊ตฌ์กฐ ๋๋ถ์ ์์ ๋ฑ์ด ๊ฐ๋ฅํ๋ค.
'๋ ์ ๋ชฉ๋ก > ๋ชจ๋ฅ๋ค Modern JS Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ชจ๋ฅ๋ค] 20์ฅ Strict Mode (0) | 2023.05.13 |
---|---|
[๋ชจ๋ฅ๋ค] 19์ฅ (2) ํ๋กํ ํ์ (0) | 2023.05.13 |
[๋ชจ๋ฅ๋ค] 18์ฅ ํจ์์ ์ผ๊ธ ๊ฐ์ฒด (0) | 2023.05.10 |
[๋ชจ๋ฅ๋ค] 17์ฅ ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ (0) | 2023.05.09 |
[๋ชจ๋ฅ๋ค] 16์ฅ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ (0) | 2023.05.08 |