Symbol
ES6 (ECMAScript 2015) 부터 도입된 원시타입으로,
기존의 문자열, 숫자, 불리언처럼 값을 직접 나타내기보다는 고유한 식별자 역할을 하는 값
객체 프로퍼티 키로 사용될 수 있고, 고유한 식별자를 생성해 충돌 없는 키를 만들 수 있는 점에서 유용
심볼은 객체 내부 동작을 오버라이드 하는데에도 활용되기 때문에 단순한 "희귀한 키" 이상의 가치를 가짐
보통 객체의 키는 문자열이나 숫자 등을 사용하지만,
복잡한 환경에서는 같은 이름의 키가 중복될 가능성이 존재
이러한 문제를 방지하기 위해 등장한 것이 Symbol
Symbol은 생성될 때마다 완전히 독립적인 값이 되고,
이 값은 디버깅을 위한 설명만을 가질 뿐, 내부적으로 절대 중복되지 않음
Symbol의 정의와 기본 사용법
Symbol() 이라는 함수로 생성
이때 선택적으로 문자열을 넘길 수 있고, 이 설명은 디버깅이나 로그 출력에 사용됨
같은 설명을 사용하더라도 생성된 심볼은 서로 다름
const s1 = Symbol();
const s2 = Symbol("desctiption");
console.log(s1); // Symbol()
console.log(s2); // Symbol(description)
console.log(Symbol("id") === Symbol("id")); // false
Symbol의 고유성
심볼의 핵심은 고유성
Symbol()을 호출할 때마다 자바스크립트 엔진은 이전에 만든 어떤 심볼과도 중복되지 않는 새로운 값을 생성
이 특성 덕분에 객체에 속성을 추가할 때, 외부 코드나 라이브러리와의 충돌을 완전히 피할 수 있음
const s1 = Symbol("userId");
const s2 = Symbol("userId");
const user = {
[s1]: 123,
[s2]: 456,
};
console.log(user[s1]); // 123
console.log(user[s2]); // 456
console.log(user); // { [Symbol(userId)]: 123, [Symbol(userId)]: 456 }
Symbol을 객체의 키로 사용할 때의 특징
Symbol은 고유성과 함께 객체 프로퍼티 키로서의 특별한 동작을 가짐
for..in 문이나 Object.keys()와 같은 메서드에서는 심볼 키가 무시되기 때문에
일종의 숨겨진 프로퍼티처럼 작동할 수 있음
이는 외부에 노출되지 않아야할 속성이나 내부적인 설정을 저장할 때 유용하게 동작할 수 있도록 의도된 설계
그러나 완전히 은닉된 것은 아니고 접근은 가능함
Object.getOwnPropertySymbols() 메서드를 통해 특정 객체에 어떤 심볼 키들이 있는지 확인 가능
전역 심볼 레지스트리
자바스크립트 엔진 내부에 존재하는 저장소로, Symbol.for(key)를 통해 접근
동일한 키를 주면 항상 같은 심볼을 반환하므로, 서로 다른 모듈이나 파일에서도 같은 심볼을 공유할 수 있게 해줌
const s1 = Symbol.for("config");
const s2 = Symbol.for("config");
console.log(s1 === s2); // true
심볼의 키 값 찾기
전역 레지스트리에 등록된 심볼은 Symbol.keyFor() 메서드를 통해 키 값을 찾을 수 있음
이를 통해 특정 심볼이 어떤 키로 등록되었는지 알아낼 수 있음
일반 심볼의 경우 레지스트리에 등록되지 않기 때문에 찾을 수 없음
const s1 = Symbol.for("token");
console.log(Symbol.keyFor(s1)); // "token"
자바스크립트 내 심볼의 역할
심볼은 단순히 객체 키로 사용되는 식별자 그 이상의 역할을 수행
자바스크립트 내장 심볼 (built in symbol)
- Symbol.iterator
반복 가능한 객체 정의
배열처럼 동작하는 사용자 정의 객체 구현 가능
- Symbol.toStringTag
객체의 [object Type] 출력 값을 정의
- Symbol.toPrimitive
객체를 원시 값으로 변환 할 때의 동작을 정의
객체가 숫자나 문자열로 암묵적으로 변환 될 때의 동작 제어 가능
- Symbol.hasInstance
instanceof 연산자의 동작을 재정의
- Symbol.match / Symbol.replace / Symbol.search
정규표현식과의 동작 제어
Reference
https://yozm.wishket.com/magazine/detail/3535/
자바스크립트에선 왜 심볼(Symbol)을 사용할까? | 요즘IT
자바스크립트에서 우리가 흔히 사용하는 자료형에는 문자열(string), 숫자(number), 불리언(boolean) 등이 있습니다. 하지만 ES6(ECAMScript2015)부터는 새로운 원시 타입인 Symbol이 도입되었고, 이는 비교적
yozm.wishket.com
'Programming > JavaScript' 카테고리의 다른 글
| 자바스크립트에서 함수와 디스 (this)의 이해 (0) | 2026.02.26 |
|---|---|
| 자바스크립트 내부 슬롯과 내부 메서드 이해하기 (0) | 2025.12.21 |
| 자바스크립트 객체의 본질과 활용 (0) | 2025.12.20 |
| 실무자를 위한 자바스크립트 '가비지 컬렉션' 가이드 (0) | 2025.11.15 |
| 인기 npm 패키지들을 대체하는 최신 Node.js 내장 기능들 (0) | 2025.10.19 |
