2025. 8. 20. 11:11ใFront-end/JavaScript

๋ชฉ์ฐจ
1. ์ฌ๋ณผํ (Symbol Type)
2. ์ ์ญ ์ฌ๋ณผ
2-1. Symbol.for(key)
2-2. Symbol.forKey(sym)
3. ์์คํ ์ฌ๋ณผ
4. ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ ๊น
1. ์ฌ๋ณผํ (Symbol Type)
์ฌ๋ณผ์ ์ ์ผํ ์๋ณ์(unique identifier)๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
// id๋ ์ฌ๋ณผ
let id = Symbol();
// ์ฌ๋ณผ id์๋ "id"๋ผ๋ ์ค๋ช
์ด ๋ถ์
let id = Symbol("id");
// ์ฌ๋ณผ์ ์ ์ผ์ฑ์ด ๋ณด์ฅ๋๊ธฐ ๋๋ฌธ์ ์ค๋ช
์ด ๋์ผํด๋ ๊ฐ ์ฌ๋ณผ๊ฐ์ ๋ค๋ฅด๋ค
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
๊ฐ์ block-scope ๋ด์์ ๊ฐ์ ์ด๋ฆ์ ์ฌ๋ณผ์ ์ฌ์ฉํ ์ ์๋ค.

์ฌ๋ณผ์ ํน์ง์ด ๋ช ๊ฐ ์๋ค.
- ๋ค๋ฅธ ํ์ ์ผ๋ก ์๋ ํ ๋ณํ๋์ง ์๋๋ค. (language guard๊ฐ ์ง์ผ์ค)
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด {...}๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ ๊ฒฝ์ฐ, ๋๊ดํธ๋ฅผ ์ฌ์ฉํด ์ฌ๋ณผํ ํค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
let user = { name: "John", [id]: 123 }; - ํค๊ฐ ์ฌ๋ณผ์ธ ํ๋กํผํฐ๋ for...in ๋ฐ๋ณต๋ฌธ์์ ๋ฐฐ์ ๋๋ค.
- Object.keys(user)์์๋ ํค๊ฐ ์ฌ๋ณผ์ธ ํ๋กํผํฐ๋ ๋ฐฐ์ ๋๋ค
- ํ์ง๋ง Object.assign์ ๊ฐ์ฒด ๋ด ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํ๋ค.
2. ์ ์ญ ์ฌ๋ณผ
์ฌ๋ณผ์ ์ด๋ฆ์ด ๊ฐ์๋ ๋ชจ๋ ๋ณ๊ฐ๋ก ์ทจ๊ธ๋์ง๋ง,
์ด๋ฆ์ด ๊ฐ์ ์ฌ๋ณผ์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธธ ์ํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์ ์ ์ญ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ(global symbol registry)๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ญ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ ์์ ์ฌ๋ณผ์ ๋ง๋ค๊ณ ํด๋น ์ฌ๋ณผ์ ์ ๊ทผํ๋ฉด, ์๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ ํญ์ ๋์ผํ ์ฌ๋ณผ์ ๋ฐํํด์ค๋ค.
1. Symbol.for(key)
๋ ์ง์คํธ๋ฆฌ ์์ ์๋ ์ฌ๋ณผ์ ์ฝ๊ฑฐ๋, ์๋ก์ด ์ฌ๋ณผ์ ์์ฑํ๋ ค๋ฉด Symbol.for(key)๋ฅผ ์ฌ์ฉํ๋ค.
์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ด๋ฆ์ด key์ธ ์ฌ๋ณผ์ ๋ฐํํ๋ฉฐ,
์กฐ๊ฑด์ ๋ง๋ ์ฌ๋ณผ์ด ๋ ์ง์คํธ๋ฆฌ์ ์์ผ๋ฉด ์๋ก์ด ์ฌ๋ณผ Symbol(key)๋ฅผ ๋ง๋ค์ด ์ ์ฅํ๋ค.
// ์ฌ๋ณผ ์ฝ๊ธฐ
let id = Symbol.for("id");
// ์กด์ฌํ๋ ์ฌ๋ณผ ์ฝ๊ธฐ
let idAgain = Symbol.for("id");
// ๋ ์ฌ๋ณผ์ด ๊ฐ์
alert( id === idAgain ); // true
2. Symbol.keyFor(sym)
Symbol.keyFor(sym)์ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ ์ด์ฉํด ์ด๋ฆ์ ์ป์ ์ ์๋ค.
let Bob = Symbol.for("name");
let _1324 = Symbol.for("id");
alert( Symbol.keyFor(Bob) );
alert( Symbol.keyFor(_1324) );
์ ์ญ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ์์ ํด๋น ์ฌ๋ณผ์ ์ด๋ฆ์ ๊ฒ์ํด์ ์ป์ด๋ธ๋ค.
์ ์ญ ์ฌ๋ณผ์ด ์๋ ์ธ์๊ฐ ๋์ด์ค๋ฉด undefined๋ฅผ ๋ฐํํ๋ค.
์ ์ญ ์ฌ๋ณผ์ด ์๋ ๋ชจ๋ ์ฌ๋ณผ์ description ํ๋กํผํฐ๊ฐ ์์ผ๋ฏ๋ก, ์ผ๋ฐ ์ฌ๋ณผ์ ์ด๋ฆ์ ์๊ณ ์ถ๋ค๋ฉด ๊ทธ๊ฑธ ์ฌ์ฉํ๋ฉด ๋๋ค.
let globalSymbol = Symbol.for("name");
let localSymboe = Symbol("name");
alert( Symbol.keyFor(globalSymbol) ); //name, ์ ์ญ ์ฌ๋ณผ
alert( Symbol.keyFor(localSymbol) ); // undefined, ์ ์ญ ์ฌ๋ณผ ์๋
alert( localSymbol.description ); // name
3. ์์คํ ์ฌ๋ณผ
์์คํ ์ฌ๋ณผ(system symbol)์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ์ฌ๋ณผ์ด๋ค.
์์คํ ์ฌ๋ณผ์ ํ์ฉํด์ ๊ฐ์ฒด๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ ์ ์๋ค.
๋ช ์ธ์์์ well-know symbols๋ฅผ ํ๋ก ๋ณผ ์ ์๋ค.
4. ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ ๊น
์ฌ์ค ์ผ๋ฐ ํ๋ก ํธ์๋ ์ค๋ฌด์์๋ ๋ง์ด ์ฌ์ฉํ์ง ์๋๋ค.
string, number, object ๋ฑ ๊ธฐ๋ณธ ์๋ฃํ๊ณผ ๊ตฌ์กฐ์ฒด๋ก๋ ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์ด๋ค.
(์๋์ ๊ฒฝ์ฐ์์๋ Symbol์ ์ ์์ฐ์ง๋ง)์์๊ฐ ์๋ค.
1. notification ๊ธฐ๋ฅ ๊ตฌํ ์
๋ฌด์ธ๊ฐ ์ญ์ ํ์ ๋ ์๋ฆผ์ ๋์์ฃผ๋ ๊ฒฝ์ฐ,
๋น ๋ฅด๊ฒ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ญ์ ํ๋ค๋ฉด ์๋ก์ด ์๋ฆผ์ฐฝ์ด ๋ฐ ๋ ๊ธฐ์กด์ ์๋ฆผ์ฐฝ์ ๋ซ์์ผ ํ๋ค๋ ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
์ด ๋ notification ํ๋ํ๋๋ฅผ ์๋ณํ ์ ์๋ ๊ฐ (Symbol)์ ์ฌ์ฉํ ์ ์๋ค.
2. api ์ํ ๊ด๋ จ ๋ณ์ ๊ฐ ์ง์ ์
api ์ํ๋ฅผ IDLE, PENDING, SUCCESS, ERROR์ 4๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋๋ค๊ณ ํ ๋,
๊ฐ ์ํ๋ฅผ string์ผ๋ก ์ ์ฅํ๋ฉด ์คํ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ํ๋ฅ ์ด ์ปค ์ฌ๋ณผ์ ์ฌ์ฉํ ์ ์๋ค.
export const apiStatus = {
IDLE: Symbol('IDLE'),
PENDING: Symbol('PENDING');
SUCCESS: Symbol('SUCCESS');
ERROR: Symbol('ERROR');
}
// or
export const IDLE = 'IDLE'
export const PENDING = 'PENDING'
export const SUCCESS = 'SUCCESS'
export const ERROR = 'ERROR'
3. ๊ฐ์ฒด ๋ด์์ ์จ๊ธฐ๊ณ ์ถ์ ํ๋กํผํฐ๊ฐ ์์ ๋
ํค๊ฐ Symbolํ์ธ ํ๋กํผํฐ๋ for...in๋ฌธ์ด๋ Object.keys(obj)์์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ๋น๋ฐ์ค๋ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋จ, Object.assign์ผ๋ก ๋ณต์ฌํ๋ฉด ์ ๋ถ ๋ณต์ฌ๋๋ค.
let password = Symbol("password");
let obj = {
name: "John",
age: 30,
id: "abcd123",
[password]: "a1b2c3!"
}
for(let key in obj){
console.log(obj[key]);
}
console.log(Object.assign(obj));

for...in๋ฌธ์ผ๋ก obj ๋ณธ๋ฌธ ์ถ๋ ฅ(Symbol ์๋ณด์)
Object.assign(obj)๋ก ๋ณต์ฌ (Symbol ๋ณด์)
์ฐธ๊ณ
'Front-end > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| B19 : ๋ฉํผ ๊ฐ์ฒด๋ก ์์ํ์ ๋ฉ์๋ ์ฐ๊ธฐ (0) | 2025.08.21 |
|---|---|
| B18 : Date ๊ฐ์ฒด (0) | 2025.08.20 |
| B16 : ์์ฑ์ ํจ์์ new ์ฐ์ฐ์ (0) | 2025.08.19 |
| B15 : ๊ฐ์ฒด์ ๋ฉ์๋ (0) | 2025.08.19 |
| B14 : ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection) (1) | 2025.08.19 |
GitHub