B17 : ์‹ฌ๋ณผ(Symbol) ํƒ€์ž…

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 ๋ณด์ž„)

 

 

 

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•