티스토리 뷰
Symbol은 JavaScript에서 유일한(Unique) 값을 생성하는 데이터 타입.
ES6(ES2015)에서 도입되었으며, 객체의 프로퍼티 키로 사용하면 다른 코드와 충돌하지 않도록 보호할 수 있다.
1️⃣ Symbol 기본 사용법
Symbol 생성하기
const sym1 = Symbol();
const sym2 = Symbol();
console.log(sym1 === sym2); // false (항상 서로 다른 값)
두 개의 Symbol은 같은 값처럼 보여도 서로 다른 값임.
2️⃣ Symbol의 주요 특징
- Symbol은 고유한 값을 가지며, 절대 중복되지 않음
- Symbol은 자동 형 변환이 불가능 (alert(Symbol()) 하면 에러 발생)
- Symbol은 객체의 키(key)로 사용 가능
- Symbol은 description을 통해 식별 가능
3️⃣ Symbol의 description
Symbol을 만들 때, 선택적으로 설명을 위한 문자열(Description) 을 추가할 수 있음
이 값은 console.log() 같은 디버깅 용도로만 활용 가능.
const sym = Symbol("내 심볼");
console.log(sym.description); // "내 심볼"
description은 단순한 설명 용도이며, Symbol 값에 영향을 주지 않는다.
4️⃣ 객체의 프로퍼티 키로 Symbol 사용하기
const id = Symbol("id"); // 설명을 위한 문자열 (디버깅 용도)
const user = {
name: "Alice",
[id]: 12345, // Symbol을 객체 키로 사용
};
console.log(user.name); // "Alice"
console.log(user[id]); // 12345 (일반적인 방법으로 접근 가능)
console.log(user); // { name: "Alice", [Symbol(id)]: 12345 }
Symbol을 사용하면 외부 코드가 id 프로퍼티에 접근하는 걸 방지할 수 있다.
5️⃣ Symbol과 for...in 루프
객체에서 Symbol을 키로 사용하면, for...in 루프에서 무시됨.
즉, 외부에서 직접 접근할 수 없는 “숨겨진 프로퍼티”를 만들 수 있다.
const secret = Symbol("secret");
const person = {
name: "Bob",
age: 25,
[secret]: "비밀 코드",
};
for (let key in person) {
console.log(key); // "name", "age"만 출력됨 (Symbol은 출력되지 않음)
}
console.log(Object.keys(person)); // ["name", "age"]
console.log(Object.getOwnPropertySymbols(person)); // [Symbol(secret)]
✅ Object.getOwnPropertySymbols()
객체에 있는 모든 Symbol 프로퍼티를 배열로 반환.
이를 이용하면 Symbol로 숨겨진 속성도 확인 가능.
Symbol은 직접 접근하지 않는 한 외부 코드에서 보이지 않는다.
6️⃣ Symbol.for()와 Symbol.keyFor()
Symbol.for()를 사용하면 전역 심볼 레지스트리(Global Symbol Registry)에 저장해서,
어디서든 동일한 Symbol을 참조할 수 있다.
const sym1 = Symbol.for("shared");
const sym2 = Symbol.for("shared");
console.log(sym1 === sym2); // true (같은 Symbol을 참조)
Symbol.keyFor() → Symbol.for()로 생성된 심볼의 키 가져오기
console.log(Symbol.keyFor(sym1)); // "shared"
Symbol.for()를 사용하면 전역적으로 동일한 Symbol을 공유할 수 있다.
하지만 일반 Symbol()은 항상 새로운 값이므로 공유되지 않음.
7️⃣ 심볼을 활용한 실전 예제
📌 1. 객체 속성 보호하기
const PASSWORD = Symbol("password");
const user = {
username: "john_doe",
[PASSWORD]: "supersecret123",
};
console.log(user.username); // "john_doe"
console.log(user.PASSWORD); // undefined (직접 접근 불가)
console.log(user[PASSWORD]); // "supersecret123"
✅ Symbol을 사용하면 비밀번호 같은 중요한 정보를 보호할 수 있음.
📌 2. JavaScript 내장 심볼(Symbol.iterator)
Symbol.iterator는 객체를 for...of 루프에서 사용할 수 있도록 만듦.
const iterableObj = {
values: [1, 2, 3],
[Symbol.iterator]: function* () {
yield* this.values;
},
};
for (let value of iterableObj) {
console.log(value); // 1, 2, 3
}
Symbol.iterator를 사용하면 커스텀 반복 가능한 객체를 만들 수 있음.
🎯 정리
✔ Symbol은 유일한 값을 생성하는 데이터 타입
✔ 객체의 프로퍼티 키로 사용 가능, for...in 루프에서 숨김 처리됨
✔ Symbol.description으로 심볼을 식별 가능 (디버깅 용도)
✔ Object.getOwnPropertySymbols()로 객체의 Symbol 프로퍼티 조회 가능
✔ Symbol.for()를 사용하면 전역 심볼을 생성하여 공유 가능
✔ Symbol.iterator 등 내장 심볼을 활용하면 강력한 기능 구현 가능
보안성 강화 + 네이밍 충돌 방지 + 내부 속성 보호를 위해 Symbol 활용
'부트캠프 > Front' 카테고리의 다른 글
[React] Drag and Drop 구현하기 (HTML API) (0) | 2025.03.28 |
---|---|
[React/JSX] 클래스 컴포넌트 vs 함수형 컴포넌트 (0) | 2025.03.26 |
[JavaScript] 디자인 패턴 (0) | 2025.03.19 |
[JavaScript, HTML, CSS] Spread Sheet 앱 만들기 (0) | 2025.03.18 |
[JavaScript] async / await란? (0) | 2025.03.18 |