Programming/Javascript

[Javascript] Symbol

Bam_t 2022. 1. 10. 15:00
728x90

심볼은 ES2015에서 추가된 새로운 데이터 형입니다.


1. Symbol

심볼(Symbol)은 상징의 뜻을 가지고 있습니다. 흔히 이메일에 사용되는 @(a.k.a 골뱅이라고 하는 at Sign, 의미는 ~에서, 에게)가 대표적인 상징입니다.

이처럼 Symbol 형이란 어떤 값에 식별되는 유일한 이름을 붙이기 위해서 사용합니다. 우리가 문자열에 @가 존재한다면 아 이게 메일 주소일 확률이 높구나 하고 추정하거나, 길을 가다가 어떤 건물에 편지봉투가 있다면 아 여기는 우체국이겠구나 하고 알아 볼 수 있는 것 처럼, 어떤 값에 식별이 가능한 값을 주어 알아볼 수 있도록 하는 데이터 형입니다.

심볼형은 다음과 같이 Symbol()을 통해 만들어집니다. 생성자가 아니므로 앞에 new가 오지 않는 점이 여태까지의 다른 데이터 형과는 차이점을 가집니다. 심볼 명령에 인수로 심볼 설명을 붙일 수 있게 되어있는데, 이 설명은 생략이 가능합니다.

let 변수 = Symbol(심볼 설명);
let symbol1 = Symbol();

 

 

2. 심볼형의 주의점

심볼 설명이 같다면, 같은 심볼이라고 생각할 수 있겠지만 아닙니다. 인수로 전달된 설명이 같아도 개별로 선언된 심볼형 변수는 서로 다른 것으로 취급이 됩니다.

let symbol1 = Symbol('hi symbol');
let symbol2 = Symbol('hi symbol');

console.log(symbol1 === symbol2);  //false

결과가 false가 나왔습니다. 위의 코드에서 'hi symbol'이라는 설명을 가진 심볼이 두 개가 생성된 것 입니다.

 

또 다른 주의점은 심볼은 다른 변수처럼 문자열/숫자형의 변환이 불가능 합니다.

let symbol = Symbol();

console.log(symbol + '');  //에러
console.log(symbol + 0);  //에러

 

하지만 boolean형으로의 변환은 가능합니다.

let symbol = Symbol();

console.log(!symbol);  //false
console.log(typeof !symbol);  //boolean

 

 

3. 심볼형의 사용

그래서 이제 심볼이 고유한 것을 만들어내기 위해 사용하겠다는 것과 주의점도 알았는데 어떻게 사용해야할까요?

심볼의 첫 번째 사용처는 private 멤버입니다. Symbol을 통해 생성한 값은 고유한 값이기 때문에 private 멤버처럼 이용할 수 있습니다. 하지만 이것은 프로토타입에서 이야기이고, ES2019에서 class 명령을 이용한 클래스에는 #을 통한 private 멤버를 지원하고 있습니다.

심볼의 두 번째 사용처는 반복자를 정의하기 위해서 사용됩니다. 반복자가 무엇인지에 대해서는 다음 포스트에서 이어서 소개해드리겠습니다.


참조

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Symbol

 

Symbol - JavaScript | MDN

Symbol() 함수는 심볼(symbol) 형식의 값을 반환하는데, 이 심볼은 내장 객체(built-in objects)의 여러 멤버를 가리키는 정적 프로퍼티와 전역 심볼 레지스트리(global symbol registry)를 가리키는 정적 메서드

developer.mozilla.org

https://ko.javascript.info/symbol

 

심볼형

 

ko.javascript.info

728x90