HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/
NodeJs
NodeJs
/
Javascript
Javascript
/
2️⃣
변수
/
📝
Symbol 상세 내용
📝

Symbol 상세 내용

Symbol.for / Symbol.keyFor 메서드사용 사례심벌과 상수ENUM심벌과 프로퍼티 키심벌과 프로퍼티 은닉심벌과 표준 빌트인 객체 지향Well-known Symbol

Symbol.for / Symbol.keyFor 메서드

  • Symbol 함수는 호출될 때마다 유일무이한 심벌 값을 생성하기에, 동일한 인자에 대해 동일한 값으로 이용하기 위해 Symbol.for 을 이용할 수 있음
  • Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 지정되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색함
    • 검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환
    • 검색에 실패하면 새로운 심벌 값 생성, 전역 심벌 레지스트리에 저장 후, 반환
const s1 = Symbol.for('mySymbol'); // mySymbol 키로 저장된 심벌 값이 없으면 새로운 심벌 값 생성 const s2 = Symbol.for('mySymbol'); // mySymbol 키로 지정된 심벌 값 있으면 해당 심벌 값을 반환 console.log(s1 === s2); // true const s1 = Symbol.for('mySymbol'); Symbol.keyFor(s1); // -> mySymbol const s2 = Symbol('foo'); Symbol.keyFor(s2); // -> undefined // Symbol 함수 호출하여 생성한 심벌 값은 전역 심벌 레지스트리에 등록되어 관리되지 않음

사용 사례

심벌과 상수

const Direction = { UP : 1, DOWN : 2, LEFT : 3, RIGHT : 4 }; const myDirection = Direction.UP; if(myDirection === Direction.UP) { console.log('You are going UP.'); }
  • 위 예제와 같이 값에는 특별한 의미가 없고 상수 이름 자체에 의미가 있는 경우가 있는데 이 때 문제는 상수 값 1, 2, 3, 4 가 변경될 수 있고, 다른 변수 값과 중복될 수도 있다는 것임
  • 변경/중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 유일무이한 심벌 값을 사용할 수 있음
const Direction = { UP: Symbol('up'), DOWN: Symbol('down'), LEFT: Symbol('left'), RIGHT: Symbol('right'), }; const myDirection = Direction.UP;

ENUM

  • 자바스크립트는 enum을 지원하지 않지만 C, 자바, 파이썬, 등 여러 프로그래밍 언어와 자바스크립트의 상위 호환인 타입스크립트에서는 enum 을 지원함
  • Object.freeze 메서드(객체의 변경을 방지하기 위해 객체를 동결)와 심벌 값을 사용
const Direction = Object.freeze({ UP : Symbol('up'), DOWN : Symbol('down'), LEFT : Symbol('left'), RIGHT : Symbol('right'), });

심벌과 프로퍼티 키

  • 객체의 프로퍼티 키는 빈 문자열을 포함하는 모든 문자열 또는 심벌 값으로 만들 수 있으며, 동적으로 생성할 수도 있음
  • 심벌 값을 프로퍼티 키로 사용하려면 프로퍼티 키로 사용할 심벌 값에 대괄호를 사용해야 함
const obj = { [Symbol.for('mySymbol')] : 1 }; obj[Symbol.for('mySymbol')]; // -> 1
  • 유일무이한 값이기에 다른 프로퍼티 키와 절대 충돌하지 않음

심벌과 프로퍼티 은닉

  • 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티는 for … in 문이나 Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없음
  • 이처럼 심벌 값을 프로퍼티 키로 사용하여 프로퍼티를 생성하면 외부에 노출할 필요가 없는 프로퍼티를 은닉할 수 있음
const obj = { [Symbol('mySymbol')] : 1 }; for (const key in obj) { console.log(key); } console.log(Object.keys(obj)); // [] console.log(Object.getOwnPropertyNames(obj)); // []
  • ES6 에서 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 Symbol 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있음

심벌과 표준 빌트인 객체 지향

  • 일반적으로 표준 빌트인 객체에 사용자 정의 메서드를 직접 추가하여 확장하는 것은 권장하지 않음(중복될 수 있기 때문에). 표준 빌트인 객체는 읽기 전용으로 사용하는 것이 좋다
  • 그러나 심벌을 이용해서 확장을 하게 되면 중복될 일은 없기에 안전하게 확장은 가능함
Array.prototype[Symbol.for('sum')] = function () { return this.reduce((acc, cur) => acc + cur, 0); }; [1.2][Symbol.for('sum')](); // 3

Well-known Symbol

  • 자바스크립트가 기본으로 제공하는 빌트인 심벌 값을 ECMAScript 사양에서는 Well-known Symbol 이라 부름
  • 예를 들어 Array, String, Map, Set, TypedArray, arguments, NodeList, HTMLCollection 과 같이 for … of 문으로 순회 가능한 빌트인 이터러블은 Well-known Symbol 인 Symbol.iterator를 키로 갖는 메서드를 가짐
    • Symbol.iterator 메서드를 호출하면 이터레이터를 반환하도록 ECMAScript 사양에 규정되어 있음
    • 빌트인 이터러블은 이 규정 즉, 이터레이션 프로토콜을 준수함
    • 빌트인 이터러블이 아닌 일반 객체를 이터러블처럼 동작하도록 구현하고 싶으면 이터레이션 프로토콜을 따르면 됨 ⇒ 즉, ECMAScript 사양에 규정되어 있는 대로 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 객체에 추가하고 이터레이터를 반환하도록 구현하면 그 객체는 이터러블이 된다
      • const iterable = { [Symbol.iterator]() { let cur = 1; const max = 5; return { next() { return { value : cur++, done: cur > max + 1 }; } }; } }; for (const num of iterable) { console.log(num); // 1 2 3 4 5 }