심볼(Symbol)
자바스크립트에서 심볼(Symbol)은 ES6에서 도입된 원시 데이터 타입(primitive data type) 중 하나입니다. 심볼은 고유하고 수정 불가능한 값으로 주로 객체 속성의 키(key)로 사용됩니다. 심볼을 사용하는 주된 이유는 충돌 없는 속성명을 보장하기 위함입니다. 즉, 심볼 값을 사용하면 동일한 이름의 다른 속성과 충돌하지 않으므로, 객체 내부의 속성이나 메소드를 안전하게 숨기거나, 객체에 메타데이터를 추가하는 등의 작업에 유용합니다.
심볼의 기본 사용법
심볼은 Symbol() 함수를 호출하여 생성할 수 있습니다. 각 심볼은 고유하므로, 동일한 설명 문자열을 사용하여 두 심볼을 생성하더라도 두 심볼은 서로 다릅니다.
let symbol1 = Symbol();
let symbol2 = Symbol('description');
let symbol3 = Symbol('description');
console.log(symbol2 === symbol3); // false
심볼을 객체 속성의 키로 사용하기
심볼을 객체의 속성 키로 사용할 때는 대괄호 **[]**를 사용하여 심볼 값을 객체의 키로 지정할 수 있습니다. 이렇게 하면 문자열 키와는 다른 고유한 속성 키를 만들 수 있습니다.
let mySymbol = Symbol('mySymbolKey');
let obj = {
[mySymbol]: 'value'
};
console.log(obj[mySymbol]); // 'value'
심볼을 이용한 속성 숨기기
심볼로 생성된 키는 for...in 루프나 Object.keys() 등으로 접근할 수 없으므로, 객체의 내부 속성을 외부에서 직접 접근하기 어렵게 만들 수 있습니다. 이는 객체의 캡슐화와 정보 은닉에 유용합니다.
let hiddenSymbol = Symbol('hidden');
let myObj = {
[hiddenSymbol]: 'hiddenValue',
visible: 'visibleValue'
};
console.log(Object.keys(myObj)); // ['visible']
console.log(myObj[hiddenSymbol]); // 'hiddenValue'
글로벌 심볼 레지스트리
Symbol.for(key) 메서드를 사용하면 전역 심볼 레지스트리에서 심볼을 생성하거나 재사용할 수 있습니다. 같은 키로 **Symbol.for()**를 호출하면, 동일한 심볼을 반환합니다. 이는 애플리케이션 전역에서 공유할 심볼을 만들 때 유용합니다.
let globalSymbol1 = Symbol.for('globalKey');
let globalSymbol2 = Symbol.for('globalKey');
console.log(globalSymbol1 === globalSymbol2); // true
Well-Known Symbols
자바스크립트는 몇몇 내장 심볼(Well-Known Symbols)을 제공합니다. 이러한 심볼들은 자바스크립트 언어 내부의 메커니즘을 커스터마이징하는 데 사용됩니다. 예를 들어, **[Symbol.iterator]**는 객체가 반복자 프로토콜을 구현하는 방법을 정의할 때 사용됩니다.
let iterableObj = {
[Symbol.iterator]: function() {
return {
next: function() {
return { done: true };
}
};
}
};
let iterator = iterableObj[Symbol.iterator]();
console.log(iterator.next()); // { done: true }
심볼은 자바스크립트 프로그래밍에서 중요한 개념 중 하나로, 객체 속성의 고유성을 보장하고, 언어의 내장 기능을 확장하는 등 다양한 용도로 사용 됩니다.