
๐ JavaScript์ ์์ฑ์ ํจ์ ๋์ ๊ณผ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฑ์ ํจ์(Constructor Function)๋ ๊ฐ์ฒด๋ฅผ ์ฐ์ด๋ด๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
์๋ ์๋ class ๋ฌธ๋ฒ์ด ์์์ด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ function์ ์์ฑ์์ฒ๋ผ ์ผ๊ณ ,
์ง๊ธ๋ ๋ด๋ถ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ค๋ฉด ๊ผญ ์์์ผ ํ๋ ๋ถ๋ถ์ด๋ผ๊ณ ํ๋ค.
๋ฐ๋ผ์ ์ด๋ฒ ํฌ์คํ ์์๋ new ํค์๋์ ํจ๊ป ์์ฑ์ ํจ์๊ฐ ์ ํํ ์ด๋ค ์์๋ก ๋ฌด์์ ํ๋์ง๋ฅผ ๋จ๊ณ๋ณ๋ก ๋ฏ์ด๋ณด๊ณ ์ ํ๋ค.
๐งญ ์ ์ฒด ํ๋ฆ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ
new Person("์์ฐ", 24) ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋์ ๋จ๊ณ๋ฅผ ์๋์ผ๋ก ํด์ค๋ค.
- ์๋ก์ด ๋น ๊ฐ์ฒด({ }) ์์ฑ
- ์ด ์ ๊ฐ์ฒด์ Person.prototype์ ์ฐ๊ฒฐํด์ค๋ค.
- Person ํจ์์ ๋ณธ๋ฌธ์ ์คํํ๋ฉด์ this๋ฅผ ์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ค๋ค.
- this.name = "์์ฐ" ์ฒ๋ผ ์์ฑ์ ๋ถ์ฌ์ค๋ค.
- ํจ์๊ฐ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ง ์์๋ค๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก this (๋ฐฉ๊ธ ๋ง๋ ์ ๊ฐ์ฒด)๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋์ ์์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ ๊ฒฐ๊ณผ์ ์ผ๋ก Person { name: "์์ฐ", age: 24 } ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ด์ ๊ฐ ๋จ๊ณ๋ฅผ ์๋์์ ๋ ์์ธํ ํ์ธํด๋ณด์.
๐ฅ ์์ฑ์ ํจ์ ์ ์ธ
๊ด๋ก์ ์ผ๋ก ์์ฑ์ ํจ์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํ๋ค๊ณ ํ๋ค. (ํ์ค์นผ ์ผ์ด์ค)
function Person(name, age) {
this.name = name;
this.age = age;
}
์ด Person ํจ์๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ์๊ธฐ๊ธด ํ์ง๋ง, new์ ํจ๊ป ์ฐ๋ฉด ํน๋ณํ ๋์์ ํ๊ฒ ๋๋ค.
๐ง new๋ก ํธ์ถํ๊ธฐ
const p1 = new Person("์์ฐ", 24);
console.log(p1); // Person { name: "์์ฐ", age: 24 }
์ฌ๊ธฐ์ new ๋ผ๋ ํค์๋์ ์๋ฏธ๋ '๋ ๊ฐ์ฒด์ข ๋ง๋ค์ด์ค'๋ผ๋ ์๋ฏธ์ด๋ค.
์ฆ, Person์ ๊ทธ๋ฅ ์คํํ๋ ๊ฒ ์๋๋ผ, ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค์ด์ ๊ทธ ์์ ๊ฐ์ ์ฑ์์ฃผ๋ ํ๋ฆ์ผ๋ก ์คํ๋๊ฒ ๋๋ค.
๐จ ๋ด๋ถ ๋์
1) ์ ๋น ๊ฐ์ฒด ์์ฑ
๋จผ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ { } ๊ฐ์ ์๋ก์ด ๋น ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ ๋ค.
์ด ๊ฐ์ฒด๊ฐ ๊ณง ์ธ์คํด์ค(์์ ์์๋ p1)์ด ๋ ์์ ์ด๋ค.
2) ํ๋กํ ํ์ ์ฐ๊ฒฐ
1๋ฒ ๊ณผ์ ์ ๊ฑฐ์ณ ์์ฑ๋ ๊ฐ์ฒด๋ ๊ทธ๋ฅ ๋น์ด์๋ ๊ฒ์ ์๋๊ณ , ๋ถ๋ชจ ์ค๋ช ์ ๊ฐ์ ๊ฑฐ๋ฅผ ๋ถ์ฌ๋๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ๋ฐ๋ก Person.prototype ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด๋ค.
const p1 = new Person("์์ฐ", 24);
console.log(Object.getPrototypeOf(p1) === Person.prototype); // true
๊ทธ๋์ ๋ง์ฝ์ p1์ด ์ด๋ค ์์ฑ์ ๋ชป ์ฐพ๊ณ ์์ผ๋ฉด,
"ํน์ ๋ค ๋ถ๋ชจ(Person.prototype)์ ์๋?"ํ๊ณ ๊ฑฐ๊ธฐ ๊ฐ์ ์์์ ์ฐพ์๋ณด๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฐ๊ฑฐ๋ฅผ ํ๋กํ ํ์ ์ฒด์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
3) this ๋ฐ์ธ๋ฉ
์ด์ Person("์์ฐ", 24) ํจ์์ ๋ณธ๋ฌธ์ ์คํํ๋๋ฐ,
์ด๋ this๊ฐ ๋ฐฉ๊ธ ๋ง๋ ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋๋ก ์๋์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
function Person(name, age) {
// ์ฌ๊ธฐ์ this === ์๋ก ๋ง๋ ์ธ์คํด์ค
this.name = name;
this.age = age;
}
์ฆ, this.name = name ์ด๋ผ๋ ๊ฒ์
์ ๊ฐ์ฒด ์์ name์ด๋ผ๋ ์์ฑ์ด ์๊ธฐ๋ ๊ฒ์ ์๋ฏธํ๋ค.
4) ์์ฑ ๋ฐ ๋ฉ์๋ ์ด๊ธฐํ
์ด์ ์ด ๋จ๊ณ์์ ๊ฐ์ฒด ์์ ํ์ํ ์์ฑ๋ค์ ์ค์ ๋ก ๋ถ์ด๊ฒ ๋๋ค.
this.name = name;
this.age = age;
๊ทธ๋ฐ๋ฐ ํจ์(๋ฉ์๋)๋ ์ด๋ป๊ฒ ๋ถ์ผ๊น?
์ฌ๊ธฐ์๋ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ๋ค.
4-1) ์์ฑ์ ์์ ์ง์ ์์ฑํ๊ธฐ
function BadPerson(name) {
this.name = name;
this.sayHi = function () {
return `Hi, ${this.name}`;
};
}
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ๋จ์ ์ ์ธ์คํด์ค๋ง๋ค ํจ์๊ฐ ๋ณต์ฌ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น๋๋ค๋ ๊ฒ์ด๋ค.
4-2) prototype์ ์์ฑํ๊ธฐ
Person.prototype.sayHi = function () {
return `Hi, ${this.name}`;
};
const p1 = new Person("์์ฐ", 24);
console.log(p1.sayHi()); // "Hi, ์์ฐ"
์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ธ์คํด์ค๊ฐ ํ๋์ ํจ์๋ง์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์๋ค๊ณ ํ๋ค.
5) ๋ฐํ ๊ท์น
์ด์ ๋ง์ง๋ง ๋จ๊ณ์ธ๋ฐ, ์ด ๋จ๊ณ์์๋ ๋ฐํ์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ด๋ return์ด ๋ฐ๋ก ์๋ค๋ฉด this๋ฅผ ๋ฐํํ๊ณ ,
return {...} ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฐํํ๋ค๋ฉด ๊ทธ๊ฒ ์ฐ์ ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ return 10 ๊ฐ์ ์์๊ฐ์ ๋ฐํํ๋ค๋ฉด, ์ด๋ ๋ฌด์๋๊ณ ๊ทธ๋ฅ this๊ฐ ๋ฐํ๋๋ค๊ณ ํ๋ค.
function A() { this.v = 1; }
console.log(new A()); // A { v: 1 }
function B() { this.v = 2; return { x: 99 }; }
console.log(new B()); // { x: 99 } ← this ๋ฌด์
function C() { this.v = 3; return 7; }
console.log(new C()); // C { v: 3 } ← ์์๊ฐ ๋ฌด์
๐ฉ ์ผ๋ฐ ํธ์ถ๊ณผ์ ์ฐจ์ด์
์ผ๋ฐ ํธ์ถ๊ณผ์ ์ฐจ์ด๋ ์๋์ ๊ฐ๋ค.
function Person(name) { this.name = name; }
const x = Person("์์ฐ"); // โ ๊ทธ๋ฅ ํธ์ถ
console.log(x); // undefined
console.log(globalThis.name); // ๋ธ๋ผ์ฐ์ : "์์ฐ" (์ ์ญ ์ค์ผ ์ํ)
// Node (strict): TypeError ๋ฐ์ ๊ฐ๋ฅ
const y = new Person("์์ฐ"); // โ
new ํธ์ถ
console.log(y); // Person { name: "์์ฐ" }
์์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด ๊ทธ๋ฅ ํธ์ถํ๋ฉด this๊ฐ ์ ์ญ(๋๋ undefined)์ ๊ฐ๋ฆฌ์ผ์ ๋ฒ๊ทธ๋ ์ ์ญ ์ค์ผ์ด ๋ฐ์ํ ์ ์์ง๋ง,
new๋ ์ ๊ฐ์ฒด ์์ฑ ๋ฐ this ๋ฐ์ธ๋ฉ์ ๋ณด์ฅํด์ค๋ค๋ ์ฅ์ ์ด ์๋ค.
(๊ทธ๋์ ์์ฑ์ ํจ์๋ ๋ฐ๋์ new์ ํจ๊ป ์จ์ผ ํ๋ ๊ฒ์ด๋ค.)
๋ํ, ์ค์ ๋ก new๋ฅผ ๋นผ๋จน์์ ๋๋ฅผ ๋๋นํด์ ์๋์ ๊ฐ์ ๋ฐฉ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค๊ณ ํ๋ค.
function SafePerson(name) {
if (!new.target) return new SafePerson(name); // new ์์ด ํธ์ถํด๋ ์์
this.name = name;
}
function SafePerson(name) {
if (!(this instanceof SafePerson)) return new SafePerson(name);
this.name = name;
}
๐ ๊ฒฐ๋ก
์ด๋ฒ์ ์์ฑ์ ํจ์์ ๋์ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํ๋ฉด์
๋จ์ํ new๋ฅผ ๋ถ์ด๋๋ ๋ง๋๋์ ์ฐจ์ด๊ฐ ์ด๋ ๊ฒ ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ ์์ผ ๋๋ผ๊ฒ ๋์๋ค.
๊ทธ๋์์ ๊ทธ๋ฅ new๋ฅผ ๋ถ์ด๋ฉด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ค๊ณ ๋ง ์๊ณ ์์๋๋ฐ,
์ฌ์ค ๊ทธ ์์์๋ '๋น ๊ฐ์ฒด ์์ฑ -> ํ๋กํ ํ์ ์ฐ๊ฒฐ -> this ๋ฐ์ธ๋ฉ -> ์์ฑ ์ด๊ธฐํ -> ๋ฐํ ๊ท์น ์ ์ฉ'
์ด๋ ๊ฒ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ์งํ๋๋ค๋ ์ฌ์ค์ ์๊ณ ๋๋, ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋์ง ๋จธ๋ฆฟ์์ ํจ์ฌ ๋ช ํํ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ธ์ ๊น์๋ ๊ฒ, ๊ทธ๋ฅ ํจ์ ํธ์ถ๊ณผ new ํธ์ถ์์ this๊ฐ ์ ์ญ์ ๊ฐ๋ฆฌํค๋๋, ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๋๋์ ์ฐจ์ด๋
์ค๋ฌด์์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์๋ ์๋ค๋ ์ ์ด์๋ค.
์์ผ๋ก๋ ๊ผญ ์์ฑ์ ํจ์๋ ํด๋์ค ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๋ this๊ฐ ์ด๋๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋์ง๋ฅผ ํญ์ ์ ๊ฒฝ์จ์ค์ผ๊ฒ ๋ค.
์ค๋ ํฌ์คํ ๋ด์ฉ์ด ๊ฐ์ธ์ ์ผ๋ก ์ ๋ง ํฅ๋ฏธ๋ก์ ์ด์
์์ผ๋ก๋ ์ถ์์ ์ผ๋ก 'new๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง์ง ~'ํ๊ณ ๋๊ธฐ๋ ๊ฒ์ด ์๋๋ผ
๊ทธ ๋ด๋ถ์ ๋์ ๊ณผ์ ์ ์์๋ณด๋ ์๊ฐ์ ๊พธ์คํ ๊ฐ์ ธ์ผ๊ฒ ๋ค.
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ ๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ์ค์ฝํ(scope) (0) | 2025.09.23 |
|---|---|
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ์ฝ๋ฐฑ ํจ์ (0) | 2025.09.21 |
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ํจ์ ์ฌํ (0) | 2025.09.20 |
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript ํจ์์ ํธ์ด์คํ (1) | 2025.09.19 |
| [๋ฆฌ์กํธ ๊ธฐ์ด ์คํฐ๋] JavaScript์ ์กฐ๊ฑด๋ฌธ, if์ switch (0) | 2025.09.19 |