์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๊ณต๊ฐ ํด๋์ค ํ๋์ ์บก์ํ์ ๋ฏธ์น๋ ์ํฅ, ๊ทธ๋ฆฌ๊ณ ๊ฒฌ๊ณ ํ ์ํํธ์จ์ด ์ค๊ณ๋ฅผ ์ํ ์ ํต์ ์ธ ์ ๊ทผ ์ ์ด ํจํด๊ณผ์ ๊ด๊ณ๋ฅผ ํ์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋น๊ณต๊ฐ ํด๋์ค ํ๋: ์บก์ํ์ ์ ๊ทผ ์ ์ด ํจํด ๋น๊ต
๋์์์ด ์งํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ๋น๊ณต๊ฐ ํด๋์ค ํ๋์ ๋์ ์ ์ฝ๋๋ฅผ ๊ตฌ์กฐํํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ์์ด ์ค์ํ ์ง์ ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ด ๋๋ฆฌ ์ฑํ๋๊ธฐ ์ ๊น์ง ์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค์์ ์ง์ ํ ์บก์ํ๋ฅผ ๋ฌ์ฑํ๋ ๊ฒ์ ํจ๊ณผ์ ์ด๊ธด ํ์ง๋ง ์ฅํฉํ๊ฑฐ๋ ์ง๊ด์ ์ด์ง ์์ ํจํด์ ์์กดํ์ต๋๋ค. ์ด ๊ฒ์๋ฌผ์์๋ ๋น๊ณต๊ฐ ํด๋์ค ํ๋์ ๊ฐ๋ ์ ๊น์ด ํ๊ณ ๋ค์ด ์บก์ํ์์ ๊ด๊ณ๋ฅผ ๋ถ์ํ๊ณ , ๊ฐ๋ฐ์๋ค์ด ์๋ ๊ฐ ํ์ฉํด ์จ ๊ธฐ์กด์ ์ ๊ทผ ์ ์ด ํจํด๊ณผ ๋์กฐํด ๋ด ๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ํฌ๊ด์ ์ธ ์ดํด๋ฅผ ์ ๊ณตํ์ฌ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฅ๋ คํ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์์ ์บก์ํ ์ดํดํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๊ณต๊ฐ ํ๋์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ ์บก์ํ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด๋ฅผ ํ๋ฆฝํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์์ ์บก์ํ๋ ์ถ์ํ, ์์, ๋คํ์ฑ๊ณผ ํจ๊ป ํต์ฌ ์์น ์ค ํ๋์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ(์์ฑ ๋๋ ํ๋กํผํฐ)์ ํด๋น ๋ฐ์ดํฐ์ ๋ํด ์๋ํ๋ ๋ฉ์๋๋ฅผ ํด๋์ค์ ๊ฐ์ ๋จ์ผ ๋จ์๋ก ๋ฌถ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์บก์ํ์ ์ฃผ์ ๋ชฉํ๋ ๊ฐ์ฒด์ ์ผ๋ถ ๊ตฌ์ฑ ์์์ ๋ํ ์ง์ ์ ์ธ ์ ๊ทผ์ ์ ํํ๋ ๊ฒ์ด๋ฉฐ, ์ด๋ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๊ฐ ๊ฐ์ฒด ์ ์ ์ธ๋ถ์์ ์ ๊ทผ๋๊ฑฐ๋ ์์ ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์บก์ํ์ ์ฃผ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฐ์ดํฐ ์๋(Data Hiding): ์๋ํ์ง ์์ ์ธ๋ถ ์์ ์ผ๋ก๋ถํฐ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ๋ณดํธํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ์ ์ฐ๋ฐ์ ์ธ ์์์ ๋ฐฉ์งํ๊ณ ๊ฐ์ฒด๊ฐ ์ ํจํ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ชจ๋์ฑ(Modularity): ํด๋์ค๋ ๋ ๋ฆฝ์ ์ธ ๋จ์๊ฐ ๋์ด ์ดํด, ์ ์ง๋ณด์ ๋ฐ ์ฌ์ฌ์ฉ์ด ๋ ์ฌ์์ง๋๋ค. ๊ณต๊ฐ ์ธํฐํ์ด์ค๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋๋ ํ, ํด๋์ค์ ๋ด๋ถ ๊ตฌํ ๋ณ๊ฒฝ์ด ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฐ๋์ ์ํฅ์ ๋ฏธ์น์ง๋ ์์ต๋๋ค.
- ์ ์ฐ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ(Flexibility and Maintainability): ๊ณต๊ฐ API๊ฐ ์์ ์ ์ผ๋ก ์ ์ง๋๋ค๋ฉด, ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ด๋ถ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ๋ฆฌํฉํ ๋ง๊ณผ ์ฅ๊ธฐ์ ์ธ ์ ์ง๋ณด์๋ฅผ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ๊ทผ ์ ์ด(Control Over Data Access): ์บก์ํ๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ข ์ข ๊ณต๊ฐ ๋ฉ์๋(๊ฒํฐ ๋ฐ ์ธํฐ)๋ฅผ ํตํด ๊ฐ์ฒด์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์์ ํ๋ ํน์ ๋ฐฉ๋ฒ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ ๋ถ์ ํจ๊ณผ๋ฅผ ํ์ฉํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์ ํต์ ์ธ ์ ๊ทผ ์ ์ด ํจํด
์ญ์ฌ์ ์ผ๋ก ๋์ ํ์ ๊ณผ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ๋ง์ OOP ์ธ์ด(์: Java, C++)์ฒ๋ผ ํด๋์ค์ ๋ด์ฅ๋ `private` ํค์๋๋ฅผ ์ง์ํ์ง ์์์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ ๋ฐ์ดํฐ ์๋๊ณผ ์ ๊ทผ ์ ์ด์ ํํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๋ค์ํ ํจํด์ ์์กดํ์ต๋๋ค. ์ด๋ฌํ ํจํด๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์งํ๋ฅผ ์ดํดํ๊ณ , ๋น๊ณต๊ฐ ํด๋์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์ ํฉํ์ง ์์ ์ํฉ์ ์ํด ์ฌ์ ํ ์ ํจํฉ๋๋ค.
1. ์ด๋ฆ ๊ท์น (๋ฐ์ค ์ ๋์ฌ)
๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ์ญ์ฌ์ ์ผ๋ก ๋๋ฆฌ ํผ์ง ๊ด๋ก๋ ๋น๊ณต๊ฐ๋ก ์๋๋ ์์ฑ ์ด๋ฆ ์์ ๋ฐ์ค(`_`)์ ๋ถ์ด๋ ๊ฒ์ด์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
class User {
constructor(name, email) {
this._name = name;
this._email = email;
}
get name() {
return this._name;
}
set email(value) {
// Basic validation
if (value.includes('@')) {
this._email = value;
} else {
console.error('Invalid email format.');
}
}
}
const user = new User('Alice', 'alice@example.com');
console.log(user._name); // Accessing 'private' property
user._name = 'Bob'; // Direct modification
console.log(user.name); // Getter still returns 'Alice'
์ฅ์ :
- ๊ตฌํํ๊ณ ์ดํดํ๊ธฐ ๊ฐ๋จํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์ปค๋ฎค๋ํฐ ๋ด์์ ๋๋ฆฌ ์๋ ค์ ธ ์์ต๋๋ค.
๋จ์ :
- ์ง์ ํ ๋น๊ณต๊ฐ๊ฐ ์๋: ์ด๊ฒ์ ์์ ํ ๊ด๋ก์ผ ๋ฟ์ ๋๋ค. ์์ฑ์ ์ฌ์ ํ ํด๋์ค ์ธ๋ถ์์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์์ ๊ท์จ์ ์์กดํฉ๋๋ค.
- ๊ฐ์ ์ฑ ์์: ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฌํ ์์ฑ์ ๋ํ ์ ๊ทผ์ ๋ง์ง ์์ต๋๋ค.
2. ํด๋ก์ ์ ์ฆ์ ์คํ ํจ์ ํํ์(IIFE)
ํด๋ก์ ๋ IIFE์ ๊ฒฐํฉํ์ฌ ๋น๊ณต๊ฐ ์ํ๋ฅผ ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ์ธ๋ถ ํจ์ ๋ด์์ ์์ฑ๋ ํจ์๋ ์ธ๋ถ ํจ์๊ฐ ์คํ์ ๋ง์น ํ์๋ ์ธ๋ถ ํจ์์ ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋น๊ณต๊ฐ ํด๋์ค ํ๋๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์ ์ง์ ํ ๋ฐ์ดํฐ ์๋์ด ๊ฐ๋ฅํ์ต๋๋ค.
const User = (function() {
let privateName;
let privateEmail;
function User(name, email) {
privateName = name;
privateEmail = email;
}
User.prototype.getName = function() {
return privateName;
};
User.prototype.setEmail = function(value) {
if (value.includes('@')) {
privateEmail = value;
} else {
console.error('Invalid email format.');
}
};
return User;
})();
const user = new User('Alice', 'alice@example.com');
console.log(user.getName()); // Valid access
// console.log(user.privateName); // undefined - cannot access directly
user.setEmail('bob@example.com');
console.log(user.getName());
์ฅ์ :
- ์ง์ ํ ๋ฐ์ดํฐ ์๋: IIFE ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ์ง์ ์ผ๋ก ๋น๊ณต๊ฐ์ด๋ฉฐ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๊ฐ๋ ฅํ ์บก์ํ.
๋จ์ :
- ์ฅํฉํจ: ์ด ํจํด์ ํนํ ๋น๊ณต๊ฐ ์์ฑ์ด ๋ง์ ํด๋์ค์ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ๋ ์ฅํฉํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ: ํด๋ก์ ์ IIFE๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ด๋ณด์์๊ฒ ์ฅ๋ฒฝ์ด ๋ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ํฅ: ์์ฑ๋ ๊ฐ ์ธ์คํด์ค๋ ์์ฒด ํด๋ก์ ๋ณ์ ์งํฉ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด๋ ์ง์ ์์ฑ์ ๋นํด ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ก ์ด์ด์ง ์ ์์ต๋๋ค (๋ฌผ๋ก ํ๋ ์์ง์ ์๋นํ ์ต์ ํ๋์ด ์์ต๋๋ค).
3. ํฉํ ๋ฆฌ ํจ์
ํฉํ ๋ฆฌ ํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค. IIFE ํจํด๊ณผ ์ ์ฌํ๊ฒ ํด๋ก์ ๋ฅผ ํ์ฉํ์ฌ ๋น๊ณต๊ฐ ์ํ๋ฅผ ๋ง๋ค ์ ์์ง๋ง, ์์ฑ์ ํจ์์ `new` ํค์๋๊ฐ ํ์ํ์ง ์์ต๋๋ค.
function createUser(name, email) {
let privateName = name;
let privateEmail = email;
return {
getName: function() {
return privateName;
},
setEmail: function(value) {
if (value.includes('@')) {
privateEmail = value;
} else {
console.error('Invalid email format.');
}
},
// Other public methods
};
}
const user = createUser('Alice', 'alice@example.com');
console.log(user.getName());
// console.log(user.privateName); // undefined
์ฅ์ :
- ๋น๊ณต๊ฐ ์ํ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํฉ๋๋ค.
- `this` ๋ฐ์ธ๋ฉ์ ๋ณต์ก์ฑ์ ํผํ ์ ์์ต๋๋ค.
๋จ์ :
- ์ถ๊ฐ์ ์ธ ํจํด(์: ํฉ์ฑ) ์์ด๋ ํด๋์ค ๊ธฐ๋ฐ OOP์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์์ ์ง์ ์ง์ํ์ง ์์ต๋๋ค.
- ํด๋์ค ์ค์ฌ์ OOP ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ๊ฐ๋ฐ์์๊ฒ๋ ๋ ์ต์ํ ์ ์์ต๋๋ค.
4. WeakMap
WeakMap์ ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ๋ ธ์ถํ์ง ์๊ณ ๊ฐ์ฒด์ ๋น๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ด์ํค๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. WeakMap์ ํค๋ ๊ฐ์ฒด์ด๋ฉฐ ๊ฐ์ ๋ฌด์์ด๋ ๋ ์ ์์ต๋๋ค. ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ฉด WeakMap์ ํด๋น ํญ๋ชฉ๋ ์ ๊ฑฐ๋ฉ๋๋ค.
const privateData = new WeakMap();
class User {
constructor(name, email) {
privateData.set(this, {
name: name,
email: email
});
}
getName() {
return privateData.get(this).name;
}
setEmail(value) {
if (value.includes('@')) {
privateData.get(this).email = value;
} else {
console.error('Invalid email format.');
}
}
}
const user = new User('Alice', 'alice@example.com');
console.log(user.getName());
// console.log(privateData.get(user).name); // This still accesses the data, but WeakMap itself isn't directly exposed as a public API on the object.
์ฅ์ :
- ์ธ์คํด์ค์ ์ง์ ์์ฑ์ ์ฌ์ฉํ์ง ์๊ณ ๋น๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ธ์คํด์ค์ ์ฒจ๋ถํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ํค๊ฐ ๊ฐ์ฒด์ด๋ฏ๋ก ํน์ ์ธ์คํด์ค์ ๊ด๋ จ๋ ์ง์ ํ ๋น๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํฉ๋๋ค.
- ์ฌ์ฉํ์ง ์๋ ํญ๋ชฉ์ ๋ํ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ .
๋จ์ :
- ๋ณด์กฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ์: `privateData` WeakMap์ ๋ณ๋๋ก ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋ ์ง๊ด์ ์ผ ์ ์์: ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ฑ๋ฅ: ์ผ๋ฐ์ ์ผ๋ก ํจ์จ์ ์ด์ง๋ง ์ง์ ์์ฑ ์ ๊ทผ์ ๋นํด ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋น๊ณต๊ฐ ํด๋์ค ํ๋(`#`) ์๊ฐ
ECMAScript 2022(ES13)์ ๋์ ๋ ๋น๊ณต๊ฐ ํด๋์ค ํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค ๋ด์์ ๋น๊ณต๊ฐ ๋ฉค๋ฒ๋ฅผ ์ ์ธํ๋ ๋ค์ดํฐ๋ธ ๋ด์ฅ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก ์ง์ ํ ์บก์ํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฒ์ ์ฒด์ธ์ ์ ๋๋ค.
๋น๊ณต๊ฐ ํด๋์ค ํ๋๋ ํด์ ์ ๋์ฌ(`#`)์ ํ๋ ์ด๋ฆ์ผ๋ก ์ ์ธ๋ฉ๋๋ค. ์ด `#` ์ ๋์ฌ๋ ํด๋น ํ๋๊ฐ ํด๋์ค์ ๋น๊ณต๊ฐ์ด๋ฉฐ ํด๋์ค ๋ฒ์ ์ธ๋ถ์์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ์ฌ์ฉ๋ฒ
class User {
#name;
#email;
constructor(name, email) {
this.#name = name;
this.#email = email;
}
// Public getter for #name
get name() {
return this.#name;
}
// Public setter for #email
set email(value) {
if (value.includes('@')) {
this.#email = value;
} else {
console.error('Invalid email format.');
}
}
// Public method to display info (demonstrating internal access)
displayInfo() {
console.log(`Name: ${this.#name}, Email: ${this.#email}`);
}
}
const user = new User('Alice', 'alice@example.com');
console.log(user.name); // Accessing via public getter -> 'Alice'
user.email = 'bob@example.com'; // Setting via public setter
user.displayInfo(); // Name: Alice, Email: bob@example.com
// Attempting to access private fields directly (will result in an error)
// console.log(user.#name); // SyntaxError: Private field '#name' must be declared in an enclosing class
// console.log(user.#email); // SyntaxError: Private field '#email' must be declared in an enclosing class
๋น๊ณต๊ฐ ํด๋์ค ํ๋์ ์ฃผ์ ํน์ง:
- ์๊ฒฉํ ๋น๊ณต๊ฐ: ํด๋์ค ์ธ๋ถ๋ ์๋ธํด๋์ค์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ ๊ทผ์ ์๋ํ๋ฉด `SyntaxError`๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ ์ ๋น๊ณต๊ฐ ํ๋: ๋น๊ณต๊ฐ ํ๋๋ `static`์ผ๋ก๋ ์ ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ์์ฒด์ ์ํจ์ ์๋ฏธํฉ๋๋ค.
- ๋น๊ณต๊ฐ ๋ฉ์๋: `#` ์ ๋์ฌ๋ ๋ฉ์๋์๋ ์ ์ฉํ์ฌ ๋น๊ณต๊ฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
- ์กฐ๊ธฐ ์ค๋ฅ ๊ฐ์ง: ๋น๊ณต๊ฐ ํ๋์ ์๊ฒฉํจ์ ์กฐ์ฉํ ์คํจ๋ ์๊ธฐ์น ์์ ๋์ ๋์ ํ์ฑ ์๊ฐ์ด๋ ๋ฐํ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋น๊ณต๊ฐ ํด๋์ค ํ๋์ ์ ๊ทผ ์ ์ด ํจํด ๋น๊ต
๋น๊ณต๊ฐ ํด๋์ค ํ๋์ ๋์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ํต์ ์ธ OOP ์ธ์ด์ ๋ ๊ฐ๊น๊ฒ ๋ง๋ค๊ณ , ์ด์ ํจํด์ ๋นํด ์บก์ํ๋ฅผ ๊ตฌํํ๋ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์บก์ํ ๊ฐ๋
๋น๊ณต๊ฐ ํด๋์ค ํ๋: ๊ฐ์ฅ ๊ฐ๋ ฅํ ํํ์ ์บก์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ๋ผ์ด๋ฒ์๋ฅผ ๊ฐ์ ํ์ฌ ์ธ๋ถ ์ ๊ทผ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๊ฐ ์ ์๋ ๊ณต๊ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด์๋ง ์์ ๋ ์ ์์์ ๋ณด์ฅํฉ๋๋ค.
์ ํต์ ์ธ ํจํด:
- ๋ฐ์ค ๊ด๋ก: ๊ฐ์ฅ ์ฝํ ํํ์ ๋๋ค. ์์ ํ ๊ถ๊ณ ์ฌํญ์ด๋ฉฐ ๊ฐ๋ฐ์์ ๊ท์จ์ ์์กดํฉ๋๋ค.
- ํด๋ก์ /IIFE/ํฉํ ๋ฆฌ ํจ์: ๋ณ์๋ฅผ ๊ฐ์ฒด์ ๊ณต๊ฐ ๋ฒ์ ๋ฐ์ ์ ์งํจ์ผ๋ก์จ ๋น๊ณต๊ฐ ํ๋์ ์ ์ฌํ ๊ฐ๋ ฅํ ์บก์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ฉ์ปค๋์ฆ์ `#` ๊ตฌ๋ฌธ๋ณด๋ค ๋ ์ง์ ์ ์ ๋๋ค.
- WeakMap: ์ข์ ์บก์ํ๋ฅผ ์ ๊ณตํ์ง๋ง ์ธ๋ถ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
๊ฐ๋ ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ
๋น๊ณต๊ฐ ํด๋์ค ํ๋: `#` ๊ตฌ๋ฌธ์ ์ ์ธ์ ์ด๋ฉฐ ์ฆ์ ๋น๊ณต๊ฐ ์๋๋ฅผ ๋ํ๋ ๋๋ค. ๊นจ๋ํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ, ํนํ ๋ค๋ฅธ OOP ์ธ์ด์ ์ต์ํ ๊ฐ๋ฐ์๋ค์ด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. ์ด๋ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
์ ํต์ ์ธ ํจํด:
- ๋ฐ์ค ๊ด๋ก: ๊ฐ๋ ์ฑ์ ์ข์ง๋ง ์ง์ ํ ํ๋ผ์ด๋ฒ์๋ฅผ ์ ๋ฌํ์ง๋ ์์ต๋๋ค.
- ํด๋ก์ /IIFE/ํฉํ ๋ฆฌ ํจ์: ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ผ๋ฉฐ, ์ค์ฝํ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ๋๋ฒ๊น ์ด ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- WeakMap: WeakMap์ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๊ณ ๋ณด์กฐ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ฏ๋ก ์ธ์ง ๋ถํ๊ฐ ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋๋ฒ๊น
๋น๊ณต๊ฐ ํด๋์ค ํ๋: ๋ ๋น ๋ฅธ ์ค๋ฅ ๊ฐ์ง๋ก ์ด์ด์ง๋๋ค. ๋น๊ณต๊ฐ ํ๋์ ์๋ชป ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ๋ช ํํ `SyntaxError` ๋๋ `ReferenceError`๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ๋๋ฒ๊น ์ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ญ๋๋ค.
์ ํต์ ์ธ ํจํด:
- ๋ฐ์ค ๊ด๋ก: ์ง์ ์ ๊ทผ์ด ๊ตฌ๋ฌธ์ ์ ํจํ๋ฏ๋ก ๋ก์ง์ ๊ฒฐํจ์ด ์๋ ํ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค.
- ํด๋ก์ /IIFE/ํฉํ ๋ฆฌ ํจ์: ํด๋ก์ ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌ๋์ง ์์ผ๋ฉด `undefined` ๊ฐ๊ณผ ๊ฐ์ ๋ฏธ๋ฌํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋, ์ค์ฝํ ๋ฌธ์ ๋ก ์ธํ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- WeakMap: `WeakMap` ์์ ์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ง๋ง, ๋๋ฒ๊น ๊ณผ์ ์์ `WeakMap` ์์ฒด๋ฅผ ๊ฒ์ฌํด์ผ ํ ์๋ ์์ต๋๋ค.
์ํธ์ด์ฉ์ฑ ๋ฐ ํธํ์ฑ
๋น๊ณต๊ฐ ํด๋์ค ํ๋: ํ๋์ ์ธ ๊ธฐ๋ฅ์ ๋๋ค. ํ์ฌ ๋ธ๋ผ์ฐ์ ๋ฒ์ ๊ณผ Node.js์์ ๋๋ฆฌ ์ง์๋์ง๋ง, ์ค๋๋ ํ๊ฒฝ์์๋ ํธํ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํ๊ธฐ ์ํด ํธ๋์คํ์ผ(์: Babel ์ฌ์ฉ)์ด ํ์ํ ์ ์์ต๋๋ค.
์ ํต์ ์ธ ํจํด: ์ค๋ซ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ ํต์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ(ํจ์, ์ค์ฝํ, ํ๋กํ ํ์ )์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ํธ๋์คํ์ผ ์์ด ๋ ๋์ ํ์ ํธํ์ฑ์ ์ ๊ณตํ์ง๋ง, ํ๋ ์ฝ๋๋ฒ ์ด์ค์์๋ ๋ ๊ด์ฉ์ ์ผ ์ ์์ต๋๋ค.
์์
๋น๊ณต๊ฐ ํด๋์ค ํ๋: ๋น๊ณต๊ฐ ํ๋์ ๋ฉ์๋๋ ์๋ธํด๋์ค์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ ์๋ธํด๋์ค๊ฐ ์ํผํด๋์ค์ ๋น๊ณต๊ฐ ๋ฉค๋ฒ์ ์ํธ ์์ฉํ๊ฑฐ๋ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ํผํด๋์ค๊ฐ ์ด๋ฅผ ์ํ ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์๋ธํด๋์ค๊ฐ ์ํผํด๋์ค์ ๋ถ๋ณ์ฑ์ ๊นจ๋จ๋ฆด ์ ์๋๋ก ๋ณด์ฅํจ์ผ๋ก์จ ์บก์ํ ์์น์ ๊ฐํํฉ๋๋ค.
์ ํต์ ์ธ ํจํด:
- ๋ฐ์ค ๊ด๋ก: ์๋ธํด๋์ค๋ `_` ์ ๋์ฌ๊ฐ ๋ถ์ ์์ฑ์ ์ฝ๊ฒ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
- ํด๋ก์ /IIFE/ํฉํ ๋ฆฌ ํจ์: ๋น๊ณต๊ฐ ์ํ๋ ์ธ์คํด์ค์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ๋ ธ์ถ๋์ง ์๋ ํ ์๋ธํด๋์ค์์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ ฅํ ์บก์ํ์ ์ ๋ถํฉํฉ๋๋ค.
- WeakMap: ํด๋ก์ ์ ์ ์ฌํ๊ฒ ๋น๊ณต๊ฐ ์ํ๋ ์ธ์คํด์ค๋ณ๋ก ๊ด๋ฆฌ๋๋ฉฐ ์๋ธํด๋์ค์ ์ง์ ๋ ธ์ถ๋์ง ์์ต๋๋ค.
์ด๋ค ํจํด์ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
ํจํด์ ์ ํ์ ์ข ์ข ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ, ๋์ ํ๊ฒฝ, ๊ทธ๋ฆฌ๊ณ ํ์ ๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ ๋ํ ์ต์ํจ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๋น๊ณต๊ฐ ํด๋์ค ํ๋(`#`)๋ฅผ ์ฌ์ฉํด์ผ ํ ๋:
- ES2022 ์ด์์ ์ง์ํ๋ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์ ์์ ํ๊ฑฐ๋ Babel๊ณผ ๊ฐ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ ๋.
- ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ๋ด์ฅ๋ ๋ฐ์ดํฐ ํ๋ผ์ด๋ฒ์ ๋ฐ ์บก์ํ ๋ณด์ฅ์ด ํ์ํ ๋.
- ๋ค๋ฅธ OOP ์ธ์ด์ ์ ์ฌํ ๋ช ํํ๊ณ ์ ์ธ์ ์ด๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ํด๋์ค ์ ์๋ฅผ ์์ฑํ๊ณ ์ถ์ ๋.
- ์๋ธํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๋ด๋ถ ์ํ์ ์ ๊ทผํ๊ฑฐ๋ ์กฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ์ ๋.
- ์๊ฒฉํ API ๊ฒฝ๊ณ๊ฐ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ ๋.
๊ธ๋ก๋ฒ ์์: ๋ค๊ตญ์ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ `Product` ๋ฐ `Order` ํด๋์ค์์ ๋น๊ณต๊ฐ ํด๋์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏผ๊ฐํ ๊ฐ๊ฒฉ ์ ๋ณด๋ ์ฃผ๋ฌธ ์ํ๊ฐ ์ธ๋ถ ์คํฌ๋ฆฝํธ์ ์ํด ์ง์ ์กฐ์๋ ์ ์๋๋ก ํ์ฌ, ์ฌ๋ฌ ์ง์ญ ๋ฐฐํฌ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
ํด๋ก์ /ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๋:
- ํธ๋์คํ์ผ ์์ด ์ค๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ์ง์ํด์ผ ํ ๋.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ ํธํ๊ฑฐ๋ `this` ๋ฐ์ธ๋ฉ ๋ฌธ์ ๋ฅผ ํผํ๊ณ ์ถ์ ๋.
- ํด๋์ค ์์์ด ์ฃผ์ ๊ด์ฌ์ฌ๊ฐ ์๋ ๊ฐ๋จํ ์ ํธ๋ฆฌํฐ ๊ฐ์ฒด๋ ๋ชจ๋์ ์์ฑํ ๋.
๊ธ๋ก๋ฒ ์์: ๋์ญํญ์ด ์ ํ์ ์ด๊ฑฐ๋ ๊ณ ๊ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ ์ ์๋ ๊ตฌํ ๊ธฐ๊ธฐ๋ฅผ ํฌํจํ์ฌ ๋ค์ํ ์์ฅ์ ์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฐ๋ฐ์๋ ๊ด๋ฒ์ํ ํธํ์ฑ๊ณผ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ๋ณด์ฅํ๊ธฐ ์ํด ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
WeakMap์ ์ฌ์ฉํด์ผ ํ ๋:
- ์ธ์คํด์ค ์์ฒด๊ฐ ํค๊ฐ ๋๋ ๋น๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ธ์คํด์ค์ ์ฒจ๋ถํด์ผ ํ๊ณ , ์ธ์คํด์ค๊ฐ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์์ ๋ ์ด ๋ฐ์ดํฐ๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋๋ก ๋ณด์ฅํ๊ณ ์ถ์ ๋.
- ๊ฐ์ฒด์ ๊ด๋ จ๋ ๋น๊ณต๊ฐ ์ํ ๊ด๋ฆฌ๊ฐ ์ค์ํ๊ณ ๊ฐ์ฒด ์์ฒด์ ๋ค์์คํ์ด์ค๋ฅผ ์ค์ผ์ํค๊ณ ์ถ์ง ์์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ ๋.
๊ธ๋ก๋ฒ ์์: ๊ธ์ต ๋ถ์ ํ์ฌ๋ WeakMap์ ์ฌ์ฉํ์ฌ ํน์ ํด๋ผ์ด์ธํธ ์ธ์ ๊ฐ์ฒด์ ๊ด๋ จ๋ ๋ ์ ์ ์ธ ๊ฑฐ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์๊ณ ๋ฆฌ์ฆ์ด ํ์ฑ ์ธ์ ์ ์ปจํ ์คํธ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๊ณ ์ธ์ ์ด ์ข ๋ฃ๋ ๋ ์๋์ผ๋ก ์ ๋ฆฌ๋์ด, ๊ธ๋ก๋ฒ ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ๋ณด์๊ณผ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๊ฐํํ ์ ์์ต๋๋ค.
๋ฐ์ค ๊ด๋ก๋ฅผ (์ฃผ์ํด์) ์ฌ์ฉํด์ผ ํ ๋:
- ๋น๊ณต๊ฐ ํ๋๋ก ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ด ํ์ค์ ์ด์ง ์์ ๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค์์ ์์ ํ ๋.
- ์ค์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ณ ๋ค๋ฅธ ํจํด์ ์ค๋ฒํค๋๊ฐ ํ์ํ์ง ์์ ๋ด๋ถ ์์ฑ์ ๊ฒฝ์ฐ.
- ์์ฑ์ด ์๊ฒฉํ๊ฒ ๋น๊ณต๊ฐ๋ ์๋๋๋ผ๋ ๋ด๋ถ์ฉ์์ ๋ค๋ฅธ ๊ฐ๋ฐ์์๊ฒ ๋ช ํํ ์๋ฆฌ๋ ์ ํธ๋ก ์ฌ์ฉํ ๋.
๊ธ๋ก๋ฒ ์์: ๊ธ๋ก๋ฒ ์คํ ์์ค ํ๋ก์ ํธ์์ ํ์ ํ๋ ํ์ ์ด๊ธฐ ๋จ๊ณ์์ ๋ด๋ถ ํฌํผ ๋ฉ์๋์ ๋ฐ์ค ๊ด๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋จ๊ณ์์๋ ๋น ๋ฅธ ๋ฐ๋ณต์ด ์ฐ์ ์๋๋ฉฐ, ์๊ฒฉํ ํ๋ผ์ด๋ฒ์๋ณด๋ค๋ ๋ค์ํ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ๊ธฐ์ฌ์๋ค ๊ฐ์ ํญ๋์ ์ดํด๊ฐ ๋ ์ค์ํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ด๋ค ํจํด์ ์ ํํ๋ , ์ ์ธ๊ณ์ ์ผ๋ก ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ผ๊ด์ฑ์ด ํต์ฌ์ ๋๋ค: ์บก์ํ๋ฅผ ์ํ ํ๋์ ์ฃผ์ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๊ณ ํ๋ก์ ํธ๋ ํ ์ ์ฒด์์ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ์ธ์. ํจํด์ ๋ฌด๋ถ๋ณํ๊ฒ ํผ์ฉํ๋ฉด ํผ๋๊ณผ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- API๋ฅผ ๋ฌธ์ํํ์ธ์: ์ด๋ค ๋ฉ์๋์ ์์ฑ์ด ๊ณต๊ฐ, ๋ณดํธ(ํด๋นํ๋ ๊ฒฝ์ฐ), ๋น๊ณต๊ฐ์ธ์ง ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ธ์. ์ด๋ ์ปค๋ฎค๋์ผ์ด์ ์ด ๋น๋๊ธฐ์ ์ด๊ฑฐ๋ ์๋ฉด์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์๋ ๊ตญ์ ํ์๊ฒ ํนํ ์ค์ํฉ๋๋ค.
- ์๋ธํด๋์ฑ์ ๊ณ ๋ คํ์ธ์: ํด๋์ค๊ฐ ํ์ฅ๋ ๊ฒ์ผ๋ก ์์๋๋ค๋ฉด, ์ ํํ ์บก์ํ ๋ฉ์ปค๋์ฆ์ด ์๋ธํด๋์ค ๋์์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง ์ ์คํ๊ฒ ๊ณ ๋ คํ์ธ์. ๋น๊ณต๊ฐ ํ๋๊ฐ ์๋ธํด๋์ค์์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ๋ ๋์ ์์ ๊ณ์ธต์ ๊ฐ์ ํ๋ ์๋์ ์ธ ์ค๊ณ ์ ํ์ ๋๋ค.
- ์ฑ๋ฅ์ ๊ณ ๋ คํ์ธ์: ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ง๋ง, ํนํ ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์ ์ฌ์ ๊ธฐ๊ธฐ์์๋ ํน์ ํจํด์ ์ฑ๋ฅ ์ํฅ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค.
- ํ๋์ ์ธ ๊ธฐ๋ฅ์ ์์ฉํ์ธ์: ๋์ ํ๊ฒฝ์ด ์ง์ํ๋ค๋ฉด ๋น๊ณต๊ฐ ํด๋์ค ํ๋๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ธ์. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค์์ ์ง์ ํ ์บก์ํ๋ฅผ ๋ฌ์ฑํ๋ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ํ ์คํธ๋ ์ค์ํฉ๋๋ค: ์บก์ํ ์ ๋ต์ด ์์๋๋ก ์๋ํ๊ณ ์๋ํ์ง ์์ ์ ๊ทผ์ด๋ ์์ ์ด ๋ฐฉ์ง๋๋์ง ํ์ธํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ํธํ์ฑ์ด ์ฐ๋ ค๋๋ ๊ฒฝ์ฐ ๋ค์ํ ํ๊ฒฝ๊ณผ ๋ฒ์ ์์ ํ ์คํธํ์ธ์.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋น๊ณต๊ฐ ํด๋์ค ํ๋(`#`)๋ ์ธ์ด์ ๊ฐ์ฒด ์งํฅ ๋ฅ๋ ฅ์ ์์ด ์๋นํ ๋์ฝ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์บก์ํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๋ด์ฅ๋๊ณ ์ ์ธ์ ์ด๋ฉฐ ๊ฒฌ๊ณ ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ, ์ค๋๋ ํจํด ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๋นํด ๋ฐ์ดํฐ ์๋ ๋ฐ ์ ๊ทผ ์ ์ด ์์ ์ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค.
ํด๋ก์ , ํฉํ ๋ฆฌ ํจ์, WeakMap๊ณผ ๊ฐ์ ์ ํต์ ์ธ ํจํด์ด ํนํ ํ์ ํธํ์ฑ์ด๋ ํน์ ์ํคํ ์ฒ ์๊ตฌ์ ์์ด ์ฌ์ ํ ๊ฐ์น ์๋ ๋๊ตฌ์ด๊ธด ํ์ง๋ง, ๋น๊ณต๊ฐ ํด๋์ค ํ๋๋ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ์ํ ๊ฐ์ฅ ๊ด์ฉ์ ์ด๊ณ ์์ ํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ ๊ณผ ์ฝ์ ์ ์ดํดํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ , ์์ ํ๋ฉฐ, ์ ๊ตฌ์กฐํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
๋น๊ณต๊ฐ ํด๋์ค ํ๋์ ์ฑํ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ์ ๋ฐ์ ์ธ ํ์ง์ ํฅ์์ํค๊ณ , ๋ค๋ฅธ ์ฃผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ด์ฐฐ๋๋ ๋ชจ๋ฒ ์ฌ๋ก์ ์ผ์น์ํค๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ ์ธ๊ณ ๊ณ ๊ฐ์ ์ํด ๋ ์ ๊ตํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค ์ ์๋๋ก ํ์ ์ค์ด์ค๋๋ค.