πŸ—Ώ Symbol [JS]

hoheesuΒ·2024λ…„ 2μ›” 16일

JavaScript

λͺ©λ‘ 보기
7/8
post-thumbnail

심볼(symbol)은 ES6μ—μ„œ μƒˆλ‘­κ²Œ μΆ”κ°€λœ 7번째 νƒ€μž…μœΌλ‘œ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œ νƒ€μž…μ˜ 값이닀. 심볼은 주둜 μ΄λ¦„μ˜ 좩돌 μœ„ν—˜μ΄ μ—†λŠ” μœ μΌν•œ 객체의 ν”„λ‘œνΌν‹° ν‚€(property key)λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

🧽Symbol의 생성

Symbol은 Symbol() ν•¨μˆ˜λ‘œ μƒμ„±ν•œλ‹€. Symbol()ν•¨μˆ˜λŠ” 호좜될 λ•Œλ§ˆλ‹€ Symbol 값을 μƒμ„±ν•œλ‹€. μ΄λ•Œ μƒμ„±λœ Symbol은 객체가 μ•„λ‹ˆλΌ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œνƒ€μž…μ΄ λ˜λŠ”κ²ƒμ΄λ‹€.

μ—¬κΈ°μ„œ μ›μ‹œνƒ€μž…μ΄λž€ μžˆλŠ” κ·ΈλŒ€λ‘œ μ €μž₯λ˜λŠ” 데이터λ₯Ό ν‘œν˜„ν•œλ‹€. μ›μ‹œκ°’μ„ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ 값이 λ³΅μ‚¬λ˜μ–΄ λ“€μ–΄κ°„λ‹€.

let one = 1; // μ›μ‹œκ°’
let two = 2; // μ›μ‹œκ°’
console.log(one) // 좜λ ₯: 1 μžˆλŠ” κ·ΈλŒ€λ‘œμ˜ 데이터λ₯Ό ν‘œν˜„
one = two; // μ›μ‹œκ°’ 볡사
one = 3; 
console.log(one);	// 3
console.log(two);	// 2 => two값이 λ³€ν•˜μ§€ μ•ŠλŠ” 것을 λ³Ό 수 μžˆλ‹€.

symbol 생성

let mySymbol = Symbol() //Symbol생성

console.log(mySymbol); // Symbol
console.log(typeof mySymbol) // symbol

Symbol()ν•¨μˆ˜λŠ” μΈμžμ— λ¬Έμžμ—΄μ„ 전달할 수 μžˆμœΌλ‚˜ 이 λ¬Έμžμ—΄μ€ ν•΄λ‹Ή 심볼에 λŒ€ν•œ μ„€λͺ…을 λ‹΄κΈ° μœ„ν•œ 주석인 description μ†μ„±λ§Œμ„ μ˜λ―Έν•  뿐 심볼 μžμ²΄μ—λŠ” 아무 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.

const symbol1 = Symbol("λ‚˜ 주석");
const symbol2 = Symbol("λ‚˜ 주석");

console.log(symbol1.description); // λ‚˜ 주석
console.log(symbol2.description); // λ‚˜ 주석
console.log(symbol1 === symbol2); // false
console.log(symbol1 == symbol2); // false

▢️ Symbol ν™œμš©

πŸ”‘ κ³ μœ ν•œ ν”„λ‘œνΌν‹° ν‚€ 생성

객체의 ν”„λ‘œνΌν‹° ν‚€λ₯Ό 생성할 λ•Œ 심볼을 μ‚¬μš©ν•˜λ©΄ λ‹€λ₯Έ μ–΄λ– ν•œ ν”„λ‘œνΌν‹°μ™€λ„ μΆ©λŒν•˜μ§€ μ•ŠλŠ” ν‚€λ₯Ό 생성할 수 μžˆλ‹€.

const obj = {};
const mySymbol = Symbol("λ‚˜ 주석");
obj[mySymbol] = "λ‚˜ 심볼값";

console.log(obj); // { [Symbol(λ‚˜ 주석)]: "λ‚˜ 심볼값"}
console.log(obj[mySymbol]); // "λ‚˜ 심볼값"

Symbol 값도 객체의 ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. Symbol 값은 μœ μΌν•œ κ°’μ΄λ―€λ‘œ Symbol 값을 ν‚€λ‘œ κ°–λŠ” ν”„λ‘œνΌν‹°λŠ” λ‹€λ₯Έ μ–΄λ– ν•œ ν”„λ‘œνΌν‹°μ™€λ„ μΆ©λŒν•˜μ§€ μ•ŠλŠ”λ‹€.

πŸ«₯ ν”„λ‘œνΌν‹° ν‚€ 감좔기

μ‹¬λ³Όλ‘œ λ§Œλ“€μ–΄μ§„ ν‚€λŠ” for ... in 루프, Object.keys(), Object.getOwnPropertyNames()와 같은 객체 쑰사 λ©”μ„œλ“œμ—μ„œ λ¬΄μ‹œλ˜λ©°, Object.getOwnPropertySymbols()λ₯Ό ν†΅ν•΄μ„œλ§Œ κ°€μ Έμ˜¬ 수 μžˆλ‹€. 이 νŠΉμ„±μ„ ν™œμš©ν•˜λ©΄ μ‹¬λ³Όλ‘œ μ„ μ–Έλœ ν‚€ 값듀을 κ°μΆ”λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

const obj = {};
const sym = Symbol("λ‚˜ 주석");

obj[sym] = "λ‚˜ 심볼값";
obj["str"] = "string";
obj.hello = "hello";

for (let i in obj) {
  console.log(i); // "str" "hello"
}

console.log(Object.getOwnPropertySymbols(obj)); //[ Symbol(λ‚˜ 주석) ]

πŸšƒ Symbol 객체 ν™œμš©

β¬†οΈμœ„μ—μ„œ Symbol 값은 Symbol()ν•¨μˆ˜λ‘œ μƒμ„±ν–ˆλ‹€. 이것은 Symbol이 ν•¨μˆ˜ κ°μ²΄λΌλŠ” μ˜λ―Έλ‹€.

μœ„ μ°Έμ‘° κ²°κ³Όμ—μ„œ μ•Œ 수 μžˆλ“―μ΄ Symbol κ°μ²΄λŠ” ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆλ‹€.
Symbol 객체의 ν”„λ‘œνΌν‹° 쀑에 length와 prototype을 μ œμ™Έν•œ ν”„λ‘œνΌν‹°λ₯Ό Well-Known Symbol이라 λΆ€λ₯Έλ‹€.

console.dir은 μš”μ†Œλ₯Ό JSONκ³Ό 같은 트리 ꡬ쑰둜 좜λ ₯ ν•˜κ³ ,DOM JS 객체의 전체 ν‘œν˜„μ„ 보렀고 ν•  λ•Œ 유용.κ°μ²΄λŠ” dir, λ‚˜λ¨Έμ§€λŠ” log둜 λ‘œκΉ…ν•˜λ©΄ νŽΈν•˜λ‹€.

β˜‘οΈ Symbol.iterator

μ΄ν„°λ ˆμ΄μ…˜
Well-Known Symbol은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μƒμˆ˜λ‘œ μ‘΄μž¬ν•˜λ©° μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 Well-Known Symbol을 μ°Έμ‘°ν•˜μ—¬ μΌμ •ν•œ 처리λ₯Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄ μ–΄λ–€ 객체가 Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° key둜 μ‚¬μš©ν•œ λ©”μ†Œλ“œ κ°€μ§€κ³  있으면 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 이 객체가 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•˜κ³  μ΄ν„°λ ˆμ΄ν„°λ‘œ λ™μž‘ν•˜λ„λ‘ ν•œλ‹€.

Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° key둜 μ‚¬μš©ν•˜μ—¬ λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλŠ” 빌트인 객체( 빌트인 μ΄ν„°λŸ¬λΈ” )λŠ” μ•„λž˜μ™€ κ°™λ‹€. μ•„λž˜μ˜ 객체듀은 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜κ³  있으며 μ΄ν„°λŸ¬μ΄ν„°λ₯Ό λ°˜ν™˜ν•œλ‹€.

// μ΄ν„°λŸ¬λΈ”
// Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° key둜 μ‚¬μš©ν•œ λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•œλ‹€.
// λ°°μ—΄μ—λŠ” Array.prototype[Symbol.iterator] λ©”μ†Œλ“œκ°€ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€.
const iterable = ['a', 'b', 'c'];

// μ΄ν„°λ ˆμ΄ν„°
// μ΄ν„°λŸ¬λΈ”μ˜ Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° key둜 μ‚¬μš©ν•œ λ©”μ†Œλ“œλŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•œλ‹€.
const iterator = iterable[Symbol.iterator]();

// μ΄ν„°λ ˆμ΄ν„°λŠ” 순회 κ°€λŠ₯ν•œ 자료 ꡬ쑰인 μ΄ν„°λŸ¬λΈ”μ˜ μš”μ†Œλ₯Ό νƒμƒ‰ν•˜κΈ° μœ„ν•œ ν¬μΈν„°λ‘œμ„œ value, done ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” next() ν•¨μˆ˜λ₯Ό λ©”μ†Œλ“œλ‘œ κ°–λŠ” 객체이닀. μ΄ν„°λ ˆμ΄ν„°μ˜ next() λ©”μ†Œλ“œλ₯Ό 톡해 μ΄ν„°λŸ¬λΈ” 객체λ₯Ό μˆœνšŒν•  수 μžˆλ‹€.
console.log(iterator.next()); // { value: 'a', done: false }
console.log(iterator.next()); // { value: 'b', done: false }
console.log(iterator.next()); // { value: 'c', done: false }
console.log(iterator.next()); // { value: undefined, done: true }

β˜† Symbol.for()

Symbol.for λ©”μ†Œλ“œλŠ” 인자둜 전달받은 λ¬Έμžμ—΄μ„ ν‚€λ‘œ μ‚¬μš©ν•˜μ—¬ Symbol 값듀이 μ €μž₯λ˜μ–΄ μžˆλŠ” μ „μ—­ Symbol λ ˆμ§€μŠ€νŠΈλ¦¬μ—μ„œ ν•΄λ‹Ή 킀와 μΌμΉ˜ν•˜λŠ” μ €μž₯된 Symbol 값을 κ²€μƒ‰ν•œλ‹€. μ΄λ•Œ 검색에 μ„±κ³΅ν•˜λ©΄ κ²€μƒ‰λœ Symbol 값을 λ°˜ν™˜ν•˜κ³ , 검색에 μ‹€νŒ¨ν•˜λ©΄ μƒˆλ‘œμš΄ Symbol 값을 μƒμ„±ν•˜μ—¬ ν•΄λ‹Ή ν‚€λ‘œ μ „μ—­ Symbol λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ €μž₯ν•œ ν›„, Symbol 값을 λ°˜ν™˜ν•œλ‹€.

// μ „μ—­ Symbol λ ˆμ§€μŠ€νŠΈλ¦¬μ— fooλΌλŠ” ν‚€λ‘œ μ €μž₯된 Symbol이 μ—†μœΌλ©΄ μƒˆλ‘œμš΄ Symbol 생성
const s1 = Symbol.for('foo');
// μ „μ—­ Symbol λ ˆμ§€μŠ€νŠΈλ¦¬μ— fooλΌλŠ” ν‚€λ‘œ μ €μž₯된 Symbol이 있으면 ν•΄λ‹Ή Symbol을 λ°˜ν™˜
const s2 = Symbol.for('foo');
console.log(s1 === s2); // true

Symbol ν•¨μˆ˜λŠ” 맀번 λ‹€λ₯Έ Symbol 값을 μƒμ„±ν•˜λŠ” 것에 λ°˜ν•΄, Symbol.for λ©”μ†Œλ“œλŠ” ν•˜λ‚˜μ˜ Symbol을 μƒμ„±ν•˜μ—¬ μ—¬λŸ¬ λͺ¨λ“ˆμ΄ ν‚€λ₯Ό 톡해 같은 Symbol을 κ³΅μœ ν•  수 μžˆλ‹€.

Symbol.for λ©”μ†Œλ“œλ₯Ό 톡해 μƒμ„±λœ Symbol 값은 λ°˜λ“œμ‹œ ν‚€λ₯Ό κ°–μ§€λ§Œ Symbol ν•¨μˆ˜λ₯Ό 톡해 μƒμ„±λœ Symbol 값은 ν‚€κ°€ μ—†λ‹€.

const shareSymbol = Symbol.for('myKey');
const key1 = Symbol.keyFor(shareSymbol);
console.log(key1); // myKey

const unsharedSymbol = Symbol('myKey');
const key2 = Symbol.keyFor(unsharedSymbol);
console.log(key2); // undefined

μ°Έκ³ λ¬Έν—Œ

profile
πŸ€”πŸ‘πŸ’‘πŸ‘¨πŸ»β€πŸ’»πŸ€―πŸ˜‡

0개의 λŒ“κΈ€