Skip to content

심볼 (Symbol) 타입 자료형

심볼은 ES2015(ES6) 표준으로 지정된 JavaScript의 자료형이다. 함수형 객체이며 메소드와 프로퍼티를 가지고 있다. 설명(description)이라는 값을 사용하여 변수의 의도를 명확하게 표현할 수 있다. 설명 값은 선택사항이다.

javascript
const symbolA = Symbol();
const symbolB = Symbol('key');

심볼 객체로 할당된 변수는 고유한 식별값을 가지며 유일성을 보장한다. 따라서 같은 심볼 설명값을 사용한 두 변수를 비교하면 서로 같지 않다는 것을 확인할 수 있다. Symbol의 고유한 값은 외부에서 확인할 수 없다.

javascript
const symbolA = Symbol('key');
const symbolB = Symbol('key');

console.log(symbolA === symbolB); // false
console.log(symbolA === 'key'); // false

고유한 특성으로 인해 할당된 변수에 다른 값을 대입할 수 없으며 다른 형으로 변환할 경우 Symbol은 무의미해진다.

심볼의 사용 용도는 주로 외부 모듈에서 선언된 객체를 사용할 때 이미 선언된 속성과 겹치면서 의도하지 않은 값으로 덮어씌우는 문제를 방지하기 위해 사용한다.

javascript
const person = {
	id: 123,
	name: 'lee'
};

person.id = 456;

console.log(person.id); // 456

위 예시에서 person.id = 456을 통해 id 속성의 값 123이 의도치 않게 변경되거나, 다시 외부 스크립트에 의해 선언한 값을 바꾸어버릴 수 있다.

아래와 같이 Symbol을 활용하면 누군가에 의해 수정되지 않는 고유한 속성을 만들어 값을 저장해 둘 수 있다.

javascript
const person = {
	id: 123,
	name: 'lee'
};

const symbolId = Symbol('id');
person[symbolId] = 456;

console.log(person['id']); // 123
console.log(person[symbolId]); // 456

person.id = 789;

console.log(person['id']); // 789
console.log(person[symbolId]); // 456

위 예시에서 person.id = 789;로 값이 변동되어도 Symbol로 정의된 속성값은 변동되지 않는다.