티스토리 뷰

부트캠프/Front

[JavaScript] Symbol이란?

혀니hyun 2025. 3. 19. 09:43

 

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 활용

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함