본문 바로가기
도서로 공부하는 프로그래밍/코딩 자율학습

JavaScript의 `Symbol`

by 열공노년 2024. 4. 30.
반응형

JavaScript의 Symbol

JavaScript의 Symbol은 ES6(ECMAScript 2015)에서 도입된 원시 데이터 타입 중 하나로, 고유하고 변경 불가능한 값을 생성하는 데 사용됩니다. Symbol은 객체 속성의 키로 주로 사용되며, 이를 통해 속성 이름 충돌의 위험 없이 객체에 메타-데이터를 추가할 수 있습니다.

Symbol의 주요 특징

  1. 고유성: 각 Symbol 값은 고유합니다. 같은 설명을 가진 두 Symbol을 생성해도, 두 Symbol은 서로 다릅니다.
  2. let symbol1 = Symbol("description"); let symbol2 = Symbol("description"); console.log(symbol1 === symbol2); // false
  3. 익명성: Symbol로 생성된 속성 이름은 for-in 루프나 Object.keys() 등의 메서드로는 접근할 수 없으며, 따라서 객체 내부를 숨기는 데 유용합니다. 속성을 완전히 숨기지는 않지만, 일반적인 방법으로는 접근하기 어렵습니다.
  4. let obj = { [Symbol("hidden")]: "Not enumerable" }; console.log(Object.getOwnPropertyNames(obj)); // []
  5. 심볼 레지스트리: Symbol.for() 메서드를 사용하면 전역 심볼 레지스트리를 통해 심볼을 생성 및 검색할 수 있습니다. 이 방법으로 생성된 심볼은 애플리케이션 전역에서 공유되어 같은 식별자를 가진 심볼에 접근할 수 있습니다.
  6. let globalSymbol = Symbol.for("app.global"); let sameGlobalSymbol = Symbol.for("app.global"); console.log(globalSymbol === sameGlobalSymbol); // true
  7. 심볼과 객체의 속성: 객체에 심볼을 속성 키로 사용하면, 이 속성은 일반적인 접근 방식으로는 보이지 않습니다. 이는 객체의 내부 인터페이스를 보호하는 데 유용할 수 있습니다.
  8. let id = Symbol("id"); let user = { name: "John", [id]: 123 }; console.log(user[id]); // 123

사용 예시

심볼은 주로 객체의 특별한 속성을 다룰 때 사용합니다. 예를 들어, 객체가 표준 행동을 오버라이드할 필요가 있는 경우 (예: 객체가 이터러블 프로토콜을 구현하는 경우), 심볼을 사용하여 충돌 없이 구현할 수 있습니다.

let iterable = {
  [Symbol.iterator]() {
    let step = 0;
    return {
      next() {
        if (step < 5) {
          step++;
          return { value: step, done: false };
        }
        return { done: true };
      }
    };
  }
};

for (let value of iterable) {
  console.log(value); // 1, 2, 3, 4, 5
}

위 예제 실행 결과

정리

Symbol은 자바스크립트에서 매우 유용한 도구로, 코드의 모듈성과 재사용성을 향상시키는 데 도움을 줄 수 있습니다.

반응형