프로그래밍 언어/JavaScript

[자바스크립트 필기] #17 - Symbol 이란

SpaceCowboy 2021. 8. 12. 16:04

 

*이 필기는 웹 프로그래밍 튜토리얼에서 보고 작성합니다. 

 

1. 심벌이란?

ES6에서 도입된 변경 불가능한 원시 타입의 값이다. 이 값은 절대적으로 유일무이한 값이라고 한다.

따라서 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다. 

 

2. 심벌 값의 생성 

 

Symbol 함수 

심벌 값은 Symbol 함수를 호출해서 생성해야한다. 

// Symbol 함수를 호출해서 유일무이한 심벌 값을 생성한다. 
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol

// 심벌 값은 외부로 노출되지 않아 확인할 수 없다. 
console.log(mySymbol); // Symbol()

Symbol.for / Symbol.keyFor 메서드

Symbol.for 메서드는 인수로 받은 문자열을 키로 해서 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색한다.

  • 검색에 성공하면 검색된 심벌 값을 반환한다. 
  • 검색에 실패하면 새로운 심벌 값을 생성하여 인수로 받은 키로 전역 심벌 레지스트리에 저장한 후, 반환한다. 
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성
const s1 = Symbol.for('mySymbol');
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 있으면 해당 심벌 값 반환 
const s2 = Symbol.for('mySymbol');

console.log(s1 === s2); // true

Symbol 함수와 다르게 Symbol.for 메서드를 사용하면 심벌 값을 단 하나 생성해서 전역 심벌 레지스트리를 통해 공유할 수 있다. 그리고 Symbol.keyFor 메서드를 사용해서 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있다. 

 

3. 심벌과 상수 

const Direction = {
    UP: Symbol('up'),
    DOWN: Symbol('down'),
    LEFT: Symbol('left'),
    RIGHT: Symbol('right')
};

const myDirection = Direction.UP;

변경/중복될 가능성이 있는 무의미한 상수 대신 유일무이한 심벌 값을 사용할 수 있다. 

 

4. 심벌과 프로퍼티 키 

const obj = {
    // 심벌 값으로 프로퍼티 키를 생성 
    [Symbol.for('mySymbol')]: 1
};

obj[Symbol.for('mySymbol')]; // -> 1

심벌 값을 프로퍼티 키로 사용하려면 대괄호를 사용해야한다. 

이 처럼 심벌값은 유일무이하므로 이걸로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다. 

 

이런 식으로 심벌 값을 프로퍼티 키로 사용해서 생성한 프로퍼티는 for ... in 문이나 Object.keys 등 메서드로 찾을 수 없다. 따라서 의도적으로 외부에 노출할 필요없는 프로퍼티를 은닉할 수 있다. 

 

5. 심벌과 표준 빌트인 객체 확장 

중복될 가능성이 없는 심벌 값으로 프로퍼티 키를 생성해 표준 빌트인 객체를 확장할 수 있다. 

중복될 일이 없으니 안전하다.

 

6. Well-known Symbol 

자바스크립트에서 기본 제공하는 빌트인 심벌 값을 Well-known Symbol 이라 부른다. 

 

예를 들어, Array, String, Map, Set 등과 같이 순회 가능한 빌트인 이터러블은 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 가진다. 그리고 이 메서드를 호출하면 이터레이터를 반환하도록 되어있다. 

 

여기까지 입니다 - 틀린 점이 있다면 꼭 지적해주세요!