JavaScript Symbol์ ๋ํด ์์๋ณด์ธ์: ๊ฐ์ฒด ํ์ฅ์ฑ ๋ฐ ๋ณด์ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ์ ์ํ ๊ณ ์ ํ ์์ฑ ํค๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ํ์ฉํ์ธ์.
JavaScript Symbol: ๊ณ ์ ํ ์์ฑ ํค ๋ฐ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ
ECMAScript 2015(ES6)์์ ๋์ ๋ JavaScript Symbol์ ๊ฐ์ฒด๋ฅผ ์ํ ๊ณ ์ ํ๊ณ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์์ฑ ํค๋ฅผ ์์ฑํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๋ฌธ์์ด๊ณผ ๋ฌ๋ฆฌ Symbol์ ๊ณ ์ ์ฑ์ด ๋ณด์ฅ๋์ด, ์๋์น ์์ ์์ฑ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ๋น๊ณต๊ฐ ์์ฑ ๊ตฌํ ๋ฐ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ๊ณผ ๊ฐ์ ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด ๊ธ์์๋ JavaScript Symbol์ ์์ฑ, ์ฌ์ฉ๋ฒ, ์ ์๋ ค์ง Symbol ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ํฌํจํ์ฌ ์ข ํฉ์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
JavaScript Symbol์ด๋ ๋ฌด์์ธ๊ฐ์?
Symbol์ ์ซ์, ๋ฌธ์์ด, ๋ถ๋ฆฌ์ธ๊ณผ ๊ฐ์ด JavaScript์ ์์ ๋ฐ์ดํฐ ํ์ ์ ๋๋ค. ํ์ง๋ง Symbol์ ๊ณ ์ ํ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์ฑ๋ ๊ฐ Symbol์ ๋ค๋ฅธ ๋ชจ๋ Symbol๊ณผ ๊ณ ์ ํ๋ฉฐ ๊ตฌ๋ณ๋ฉ๋๋ค. ์ด๋ฌํ ๊ณ ์ ์ฑ์ Symbol์ด ๊ฐ์ฒด์ ์์ฑ ํค๋ก ์ฌ์ฉํ๊ธฐ์ ์ด์์ ์์ ์๋ฏธํ๋ฉฐ, ์์ฑ์ด ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํด ์๋์น ์๊ฒ ๋ฎ์ด์ฐ์ด๊ฑฐ๋ ์ก์ธ์ค๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ฐ์ฒด์ ์ถ๊ฐ๋ ์ ์๋ ์์ฑ์ ๋ํ ์์ ํ ์ ์ด๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์ ์์ ํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
Symbol์ ํน์ Symbol์ ์๋ ๋น์ (๋๋ ์ฝ๋)๋ง์ด ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด์ ํน๋ณํ๊ณ ์จ๊ฒจ์ง ๋ ์ด๋ธ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฐํด๋ณด์ธ์. ์ด๋ ์ฌ์ค์ ๋น๊ณต๊ฐ์ธ ์์ฑ์ ์์ฑํ๊ฑฐ๋, ๊ฐ์ฒด์ ๊ธฐ์กด ์์ฑ๊ณผ ์ถฉ๋ํ์ง ์๊ณ ๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋๋ก ํฉ๋๋ค.
Symbol ์์ฑ
Symbol์ Symbol() ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. ์์ฑ์๋ Symbol์ ๋ํ ์ค๋ช
์ผ๋ก ์ฌ์ฉ๋๋ ์ ํ์ ๋ฌธ์์ด ์ธ์๋ฅผ ์ทจํฉ๋๋ค. ์ด ์ค๋ช
์ ๋๋ฒ๊น
๋ฐ ์๋ณ์ ์ ์ฉํ์ง๋ง Symbol์ ๊ณ ์ ์ฑ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ๋์ผํ ์ค๋ช
์ผ๋ก ์์ฑ๋ ๋ Symbol์ ์ฌ์ ํ ๋ณ๊ฐ์
๋๋ค.
๊ธฐ๋ณธ Symbol ์์ฑ
๊ธฐ๋ณธ Symbol์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const mySymbol = Symbol();
const anotherSymbol = Symbol("My Description");
console.log(mySymbol); // Output: Symbol()
console.log(anotherSymbol); // Output: Symbol(My Description)
console.log(typeof mySymbol); // Output: symbol
๋ณด์๋ค์ํผ, typeof ์ฐ์ฐ์๋ mySymbol๊ณผ anotherSymbol์ด ์ค์ ๋ก symbol ํ์
์์ ํ์ธํฉ๋๋ค.
Symbol์ ๊ณ ์ ํฉ๋๋ค
Symbol์ ๊ณ ์ ์ฑ์ ๊ฐ์กฐํ๊ธฐ ์ํด ๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์ธ์.
const symbol1 = Symbol("example");
const symbol2 = Symbol("example");
console.log(symbol1 === symbol2); // Output: false
๋ Symbol์ด ๋์ผํ ์ค๋ช ("example")์ผ๋ก ์์ฑ๋์์์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ์ง ์์ต๋๋ค. ์ด๋ Symbol์ ๊ทผ๋ณธ์ ์ธ ๊ณ ์ ์ฑ์ ๋ณด์ฌ์ค๋๋ค.
Symbol์ ์์ฑ ํค๋ก ์ฌ์ฉํ๊ธฐ
Symbol์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ ๊ฐ์ฒด์ ์์ฑ ํค๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. Symbol์ ์์ฑ ํค๋ก ์ฌ์ฉํ ๋๋ Symbol์ ๋๊ดํธ๋ก ๋ฌถ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ JavaScript๊ฐ Symbol์ ํํ์์ผ๋ก ์ทจ๊ธํ๋ฉฐ, ํํ์์ ํ๊ฐํ๋ ค๋ฉด ๋๊ดํธ ํ๊ธฐ๋ฒ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์ฒด์ Symbol ์์ฑ ์ถ๊ฐํ๊ธฐ
๊ฐ์ฒด์ Symbol ์์ฑ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const myObject = {};
const symbolA = Symbol("propertyA");
const symbolB = Symbol("propertyB");
myObject[symbolA] = "Value A";
myObject[symbolB] = "Value B";
console.log(myObject[symbolA]); // Output: Value A
console.log(myObject[symbolB]); // Output: Value B
์ด ์์ ์์ symbolA์ symbolB๋ myObject์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๊ณ ์ ํค๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์์ฑ ํค๋ก Symbol์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
Symbol์ ์์ฑ ํค๋ก ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค.
- ์์ฑ ์ด๋ฆ ์ถฉ๋ ๋ฐฉ์ง: Symbol์ ์์ฑ ์ด๋ฆ์ ๊ณ ์ ์ฑ์ ๋ณด์ฅํ์ฌ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ์ ์์ ํ ๋ ์๋์น ์์ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์บก์ํ: Symbol์ ์ด๊ฑฐํ ์ ์์ผ๋ฉฐ ๊ฐ์ฒด ์ธ๋ถ์์ ์ ๊ทผํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ๋น๊ณต๊ฐ ์์ฑ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ: Symbol์ ๊ฐ์ฒด์ ๊ธฐ์กด ์์ฑ๊ณผ ์ถฉ๋ํ์ง ์๊ณ ๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฒจ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
Symbol๊ณผ ์ด๊ฑฐ
Symbol ์์ฑ์ ์ค์ํ ํน์ง ์ค ํ๋๋ ์ด๊ฑฐํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ฆ, for...in ๋ฃจํ, Object.keys() ๋๋ Object.getOwnPropertyNames()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์์ฑ์ ๋ฐ๋ณตํ ๋ ํฌํจ๋์ง ์์ต๋๋ค.
์ด๊ฑฐํ ์ ์๋ Symbol ์์ฑ ์์
const myObject = {
name: "Example",
age: 30
};
const symbolC = Symbol("secret");
myObject[symbolC] = "Top Secret!";
console.log(Object.keys(myObject)); // Output: [ 'name', 'age' ]
console.log(Object.getOwnPropertyNames(myObject)); // Output: [ 'name', 'age' ]
for (let key in myObject) {
console.log(key); // Output: name, age
}
๋ณด์๋ค์ํผ, Symbol ์์ฑ symbolC๋ Object.keys(), Object.getOwnPropertyNames() ๋๋ for...in ๋ฃจํ์ ์ถ๋ ฅ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ๋์์ Symbol ์ฌ์ฉ์ ์บก์ํ ์ด์ ์ ๊ธฐ์ฌํฉ๋๋ค.
Symbol ์์ฑ ์ ๊ทผํ๊ธฐ
Symbol ์์ฑ์ ์ ๊ทผํ๋ ค๋ฉด, ์ฃผ์ด์ง ๊ฐ์ฒด์์ ์ง์ ์ฐพ์ ๋ชจ๋ Symbol ์์ฑ์ ๋ฐฐ์ด์ ๋ฐํํ๋ Object.getOwnPropertySymbols()๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
const symbolProperties = Object.getOwnPropertySymbols(myObject);
console.log(symbolProperties); // Output: [ Symbol(secret) ]
console.log(myObject[symbolProperties[0]]); // Output: Top Secret!
์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ด๊ฑฐํ ์ ์๋ Symbol ์์ฑ์ ๊ฒ์ํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
์ ์๋ ค์ง Symbol
JavaScript๋ "์ ์๋ ค์ง Symbol"์ด๋ผ๊ณ ํ๋ ๋ฏธ๋ฆฌ ์ ์๋ Symbol ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด Symbol๋ค์ ์ธ์ด์ ํน์ ๋ด๋ถ ๋์์ ๋ํ๋ด๋ฉฐ ํน์ ์ํฉ์์ ๊ฐ์ฒด์ ๋์์ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ ์๋ ค์ง Symbol์ Symbol ์์ฑ์์ ์์ฑ์ผ๋ก, Symbol.iterator, Symbol.toStringTag, Symbol.hasInstance ๋ฑ์ด ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ์๋ ค์ง Symbol
๋ค์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ์๋ ค์ง Symbol ์ค ์ผ๋ถ์ ๋๋ค.
Symbol.iterator: ๊ฐ์ฒด์ ๊ธฐ๋ณธ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ง์ ํฉ๋๋ค.for...of๋ฃจํ์์ ๊ฐ์ฒด์ ์์๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.Symbol.toStringTag:Object.prototype.toString()์ด ํธ์ถ๋ ๋ ๊ฐ์ฒด์ ๋ํ ์ฌ์ฉ์ ์ ์ ๋ฌธ์์ด ์ค๋ช ์ ์ง์ ํฉ๋๋ค.Symbol.hasInstance: ๊ฐ์ฒด๊ฐ ํด๋์ค์ ์ธ์คํด์ค๋ก ๊ฐ์ฃผ๋๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.instanceof์ฐ์ฐ์์์ ์ฌ์ฉ๋ฉ๋๋ค.Symbol.toPrimitive: ๊ฐ์ฒด๋ฅผ ์์ ๊ฐ์ผ๋ก ๋ณํํ๋ ๋ฉ์๋๋ฅผ ์ง์ ํฉ๋๋ค.Symbol.asyncIterator: ๊ฐ์ฒด์ ๊ธฐ๋ณธ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ง์ ํฉ๋๋ค.for await...of๋ฃจํ์์ ์ฌ์ฉ๋ฉ๋๋ค.
Symbol.iterator ์ฌ์ฉํ๊ธฐ
Symbol.iterator๋ ๊ฐ์ฅ ์ ์ฉํ ์ ์๋ ค์ง Symbol ์ค ํ๋์
๋๋ค. ์ด๋ for...of ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๋ฐ๋ณต๋์ด์ผ ํ๋์ง ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค.
const myIterable = {
data: [1, 2, 3, 4, 5],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (const value of myIterable) {
console.log(value); // Output: 1, 2, 3, 4, 5
}
์ด ์์ ์์๋ Symbol.iterator๋ฅผ ์ฌ์ฉํ์ฌ myIterable์ ๋ํ ์ฌ์ฉ์ ์ ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ ์ํฉ๋๋ค. ์ด ์ดํฐ๋ ์ดํฐ๋ ๋ฐฐ์ด์ ๋์ ๋๋ฌํ ๋๊น์ง data ๋ฐฐ์ด์ ๊ฐ์ ํ๋์ฉ ๋ฐํํฉ๋๋ค.
Symbol.toStringTag ์ฌ์ฉํ๊ธฐ
Symbol.toStringTag๋ฅผ ์ฌ์ฉํ๋ฉด Object.prototype.toString()์ ์ฌ์ฉํ ๋ ๊ฐ์ฒด์ ๋ฌธ์์ด ํํ์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
class MyClass {}
MyClass.prototype[Symbol.toStringTag] = "MyCustomClass";
const instance = new MyClass();
console.log(Object.prototype.toString.call(instance)); // Output: [object MyCustomClass]
Symbol.toStringTag๊ฐ ์์ผ๋ฉด ์ถ๋ ฅ์ [object Object]๊ฐ ๋ฉ๋๋ค. ์ด Symbol์ ํตํด ๋ ์ค๋ช
์ ์ธ ๋ฌธ์์ด ํํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
Symbol์ ์ค์ ์ ์ฉ ์ฌ๋ก
Symbol์ JavaScript ๊ฐ๋ฐ์์ ๋ค์ํ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์์ ๋๋ค.
๋น๊ณต๊ฐ ์์ฑ ๊ตฌํ
JavaScript๋ ๋ค๋ฅธ ์ผ๋ถ ์ธ์ด์ฒ๋ผ ์ง์ ํ ๋น๊ณต๊ฐ ์์ฑ์ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง, Symbol์ ์ฌ์ฉํ์ฌ ๋น๊ณต๊ฐ ์์ฑ์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค. Symbol์ ์์ฑ ํค๋ก ์ฌ์ฉํ๊ณ ํด๋น Symbol์ ํด๋ก์ ์ ๋ฒ์ ๋ด์ ์ ์งํจ์ผ๋ก์จ ์์ฑ์ ๋ํ ์ธ๋ถ ์ ๊ทผ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
const createCounter = () => {
const count = Symbol("count");
const obj = {
[count]: 0,
increment() {
this[count]++;
},
getCount() {
return this[count];
}
};
return obj;
};
const counter = createCounter();
counter.increment();
console.log(counter.getCount()); // Output: 1
console.log(counter[Symbol("count")]); // Output: undefined (outside scope)
์ด ์์ ์์ count Symbol์ createCounter ํจ์ ๋ด์์ ์ ์๋์ด ํด๋ก์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์์ ํ ๋น๊ณต๊ฐ๋ ์๋์ง๋ง, ์ด ์ ๊ทผ ๋ฐฉ์์ ์ข์ ์์ค์ ์บก์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ ์ฒจ๋ถํ๊ธฐ
Symbol์ ๊ฐ์ฒด์ ๊ธฐ์กด ์์ฑ๊ณผ ์ถฉ๋ํ์ง ์๊ณ ๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฒจ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ ์ด๊ฑฐํ ์ ์๊ฑฐ๋ ํ์ค ์์ฑ ์ ๊ทผ์ ํตํด ์ ๊ทผํ ์ ์์ด์ผ ํ๋ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ฐ์ฒด์ ์ถ๊ฐํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
const myElement = document.createElement("div");
const metadataKey = Symbol("metadata");
myElement[metadataKey] = {
author: "John Doe",
timestamp: Date.now()
};
console.log(myElement[metadataKey]); // Output: { author: 'John Doe', timestamp: 1678886400000 }
์ฌ๊ธฐ์ Symbol์ DOM ์์์ ํ์ค ์์ฑ์ด๋ ํน์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฒจ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ฌ ๊ฐ์ฒด ํ์ฅํ๊ธฐ
ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ์ ์์ ํ ๋ Symbol์ ์ฌ์ฉํ์ฌ ์์ฑ ์ด๋ฆ ์ถฉ๋ ์ํ ์์ด ์ฌ์ฉ์ ์ ์ ๊ธฐ๋ฅ์ ๊ฐ์ฒด์ ํ์ฅํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋ณธ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ด๋ ๋์์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
// Assume 'libraryObject' is an object from an external library
const libraryObject = {
name: "Library Object",
version: "1.0"
};
const customFunction = Symbol("customFunction");
libraryObject[customFunction] = () => {
console.log("Custom function called!");
};
libraryObject[customFunction](); // Output: Custom function called!
์ด ์์ ์์๋ Symbol์ ์ฌ์ฉํ์ฌ libraryObject์ ์ฌ์ฉ์ ์ ์ ํจ์๊ฐ ์ถ๊ฐ๋์ด ๊ธฐ์กด ์์ฑ๊ณผ ์ถฉ๋ํ์ง ์๋๋ก ํฉ๋๋ค.
Symbol๊ณผ ์ ์ญ Symbol ๋ ์ง์คํธ๋ฆฌ
๋ก์ปฌ Symbol์ ์์ฑํ๋ ๊ฒ ์ธ์๋ JavaScript๋ ์ ์ญ Symbol ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ ๋๋ ๋ค๋ฅธ JavaScript ํ๊ฒฝ(์: ๋ธ๋ผ์ฐ์ ์ ๋ค๋ฅธ iframe) ๊ฐ์ ๊ณต์ ๋๋ Symbol์ ์์ฑํ๊ณ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ ์ญ Symbol ๋ ์ง์คํธ๋ฆฌ ์ฌ์ฉํ๊ธฐ
์ ์ญ ๋ ์ง์คํธ๋ฆฌ์์ Symbol์ ์์ฑํ๊ฑฐ๋ ๊ฒ์ํ๋ ค๋ฉด Symbol.for() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฉ์๋๋ Symbol์ ํค๋ก ์ฌ์ฉ๋๋ ๋ฌธ์์ด ์ธ์๋ฅผ ์ทจํฉ๋๋ค. ์ฃผ์ด์ง ํค๋ฅผ ๊ฐ์ง Symbol์ด ๋ ์ง์คํธ๋ฆฌ์ ์ด๋ฏธ ์กด์ฌํ๋ฉด Symbol.for()๋ ๊ธฐ์กด Symbol์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฃผ์ด์ง ํค๋ก ์ Symbol์ ์์ฑํ์ฌ ๋ ์ง์คํธ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค.
const globalSymbol1 = Symbol.for("myGlobalSymbol");
const globalSymbol2 = Symbol.for("myGlobalSymbol");
console.log(globalSymbol1 === globalSymbol2); // Output: true
console.log(Symbol.keyFor(globalSymbol1)); // Output: myGlobalSymbol
์ด ์์ ์์ globalSymbol1๊ณผ globalSymbol2๋ ์ ์ญ ๋ ์ง์คํธ๋ฆฌ์ ์๋ ๋์ผํ Symbol์ ์ฐธ์กฐํฉ๋๋ค. Symbol.keyFor() ๋ฉ์๋๋ ๋ ์ง์คํธ๋ฆฌ์ ์๋ Symbol๊ณผ ์ฐ๊ฒฐ๋ ํค๋ฅผ ๋ฐํํฉ๋๋ค.
์ ์ญ Symbol ๋ ์ง์คํธ๋ฆฌ์ ์ด์
์ ์ญ Symbol ๋ ์ง์คํธ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- Symbol ๊ณต์ : ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ๋ค๋ฅธ JavaScript ํ๊ฒฝ ๊ฐ์ Symbol์ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ: ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋์ผํ Symbol์ด ์ผ๊ด๋๊ฒ ์ฌ์ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ํธ ์ด์ฉ์ฑ: Symbol์ ๊ณต์ ํด์ผ ํ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ ๊ฐ์ ์ํธ ์ด์ฉ์ฑ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
Symbol ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Symbol๊ณผ ์์ ํ ๋๋ ์ฝ๋๊ฐ ๋ช ํํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ฐ๋ฉฐ ํจ์จ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ค๋ช ์ ์ธ Symbol ์ค๋ช ์ฌ์ฉ: ๋๋ฒ๊น ๋ฐ ์๋ณ์ ๋์์ด ๋๋๋ก Symbol์ ์์ฑํ ๋ ์๋ฏธ ์๋ ์ค๋ช ์ ์ ๊ณตํ์ญ์์ค.
- ์ ์ญ Symbol ์ค์ผ ๋ฐฉ์ง: ์ ์ญ Symbol ๋ ์ง์คํธ๋ฆฌ ์ค์ผ์ ํผํ๊ธฐ ์ํด ๊ฐ๋ฅํ ํ ๋ก์ปฌ Symbol์ ์ฌ์ฉํ์ญ์์ค.
- Symbol ์ฌ์ฉ ๋ฌธ์ํ: ์ฝ๋์ ๊ฐ๋ ์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ์ฝ๋์์ Symbol์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
- ์ฑ๋ฅ ์ํฅ ๊ณ ๋ ค: Symbol์ ์ผ๋ฐ์ ์ผ๋ก ํจ์จ์ ์ด์ง๋ง, ๊ณผ๋ํ Symbol ์ฌ์ฉ์ ํนํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ์ ์ ์ฌ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๋ค์ํ ๊ตญ๊ฐ์ ์ค์ ์ฌ๋ก
Symbol์ ์ฌ์ฉ์ ์ ์ธ๊ณ์ ์ผ๋ก ๋ค์ํ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ฑธ์ณ ํ์ฅ๋ฉ๋๋ค. ๋ค์์ ๋ค์ํ ์ง์ญ ๋ฐ ์ฐ์ ์ ๋ง์ถฐ์ง ๋ช ๊ฐ์ง ๊ฐ๋ ์ ์์์ ๋๋ค.
- ์ ์์๊ฑฐ๋ ํ๋ซํผ (๊ธ๋ก๋ฒ): ํ ๋๊ท๋ชจ ๊ตญ์ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์ํ ์ ๋ณด ํ์๋ฅผ ์ํ ์ฌ์ฉ์ ์ ํธ๋๋ฅผ ์ ์ฅํ๋ ๋ฐ Symbol์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ํต์ฌ ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ ํ์ง ์๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ธํํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ, ๋ค์ํ ๊ตญ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ (์: ์ ๋ฝ์ GDPR)์ ์ค์ํฉ๋๋ค.
- ์๋ฃ ์์คํ (์ ๋ฝ): ํ ์ ๋ฝ ์๋ฃ ์์คํ ์ ํ์ ๊ธฐ๋ก์ ๋ณด์ ์์ค์ ํ๊ทธํ๋ ๋ฐ Symbol์ ์ฌ์ฉํ์ฌ ๋ฏผ๊ฐํ ์๋ฃ ์ ๋ณด๊ฐ ์น์ธ๋ ์ง์์๊ฒ๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ Symbol์ ๊ณ ์ ์ฑ์ ํ์ฉํ์ฌ ์ฐ๋ฐ์ ์ธ ๋ฐ์ดํฐ ์นจํด๋ฅผ ๋ฐฉ์งํ๊ณ , ์๊ฒฉํ ์๋ฃ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฒ๋ฅ ์ ๋ถํฉํฉ๋๋ค.
- ๊ธ์ต ๊ธฐ๊ด (๋ถ๋ฏธ): ํ ๋ถ๋ฏธ ์ํ์ ์ถ๊ฐ ์ฌ๊ธฐ ๋ถ์์ด ํ์ํ ๊ฑฐ๋๋ฅผ ํ์ํ๋ ๋ฐ Symbol์ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฒ๋ฆฌ ๋ฃจํด์ผ๋ก๋ ์ ๊ทผํ ์ ์๋ ์ด Symbol์ ๊ฐํ๋ ๋ณด์์ ์ํ ํน์ ์๊ณ ๋ฆฌ์ฆ์ ํธ๋ฆฌ๊ฑฐํ์ฌ ๊ธ์ต ๋ฒ์ฃ์ ๊ด๋ จ๋ ์ํ์ ์ต์ํํฉ๋๋ค.
- ๊ต์ก ํ๋ซํผ (์์์): ํ ์์์ ๊ต์ก ํ๋ซํผ์ ๋์ด๋ ๋ฐ ๋์ ๋ ์์ ๊ฐ์ ํ์ต ์๋ฃ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ Symbol์ ํ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์๋ค์ ์ํ ๋ง์ถคํ ํ์ต ๊ฒฝ๋ก๋ฅผ ํ์ฑํํ๊ณ ์๋ณธ ์ฝํ ์ธ ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๊ต์ก ๊ฒฝํ์ ์ต์ ํํฉ๋๋ค.
- ๊ณต๊ธ๋ง ๊ด๋ฆฌ (๋จ๋ฏธ): ํ ๋จ๋ฏธ ๋ฌผ๋ฅ ํ์ฌ๋ ์จ๋ ์กฐ์ ์ด์ก ๋๋ ์ํ ๋ฌผ์ง ์ ์ฐจ์ ๊ฐ์ ํน๋ณ ์ทจ๊ธ์ด ํ์ํ ์ ์ ๋ฌผ์ ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ๋ฐ Symbol์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ฏผ๊ฐํ ํ๋ชฉ์ด ์ ์ ํ๊ฒ ์ทจ๊ธ๋๋๋ก ๋ณด์ฅํ์ฌ ์ํ์ ์ต์ํํ๊ณ ๊ตญ์ ์ด์ก ๊ท์ ์ ์ค์ํฉ๋๋ค.
๊ฒฐ๋ก
JavaScript Symbol์ ์ฝ๋์ ๋ณด์, ์บก์ํ ๋ฐ ํ์ฅ์ฑ์ ํฅ์์ํฌ ์ ์๋ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๊ธฐ๋ฅ์ ๋๋ค. Symbol์ ๊ณ ์ ํ ์์ฑ ํค์ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ์ผ๋ก์จ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค. Symbol์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ๋ง์คํฐํ๋ ค๋ ๋ชจ๋ JavaScript ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ ๋๋ค. ๋น๊ณต๊ฐ ์์ฑ ๊ตฌํ๋ถํฐ ๊ฐ์ฒด ๋์ ์ฌ์ฉ์ ์ ์์ ์ด๋ฅด๊ธฐ๊น์ง Symbol์ ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ๊ด๋ฒ์ํ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ , ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ๋ ์๊ด์์ด Symbol์ ํ์ฉํ์ฌ JavaScript ์ฝ๋์ ํ์ง๊ณผ ๋ณด์์ ํฅ์์ํค๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ธ์. ์ ์๋ ค์ง Symbol์ ํ์ํ๊ณ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์คํํ์ฌ ์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐ๊ฒฌํ์ญ์์ค.