33. 7번째 데이터 타입, Symbol

Jun_Gyu·2025년 2월 13일
0

한 발자국 더, JS

목록 보기
20/34
post-thumbnail

1. 심벌(Symbol)이란?

ES6에서 도입된 7번째 데이터 타입으로, 변경 불가능한 원시 타입의 값.

  • 심벌 값은 다른 값과 중복되지 않는 유일무이한 값.
  • 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해서 사용.

2. 심벌 값의 생성

Symbol 함수

  • 심벌 값은 Symbol 함수를 호출하여 생성함.

  • 문자열, 숫자, boolean, undefined, null 타입과 같은 다른 원시값과 달리 심벌 값은 Symbol 함수를 호출하여 생성해야 함.
    (new 연산자와 함께 호출하지 않음.)

  • 이 때 생성된 심벌값은 외부로 노출되지 않아 확인할 수 없음.

  • 다른 값과는 중복되지 않는 유일무이한 값.

  • Symbol 함수에는 선택적으로 문자열을 인수로 전달할 수 있음.

// symbol 값이 같아도 각자 독자적인 심벌값을 생성.
const symbol1 = Symbol('test');
const symbol2 = Symbol('test');

console.log(symbol1 === symbol2); // false 출력.
  • 심벌 값도 문자열, 숫자, boolean과 같이 객체처럼 접근 시 암묵적으로 Rapper 객체를 생성함.
const testSymbol = Symbol('test')

console.log(testSymbol.description); // test
console.log(testSymbol.toString());  // Symbol(test)
  • 심벌 값은 암묵적으로 문자열이나 숫자타입으로 변환되지 않음.

  • 단, 불리언 타입으로는 암묵적으로 타입 변환됨.


Symbol.for / Symbol.keyFor 메서드

1. Symbol.for 메서드

Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌값의 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌값을 검색함.

- 검색 성공시 새로운 심벌값을 생성 X, 검색된 심벌 값 반환.
- 검색 실패시 새로운 심벌값을 생성, Symbol.for 메서드의 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후, 생성된 심벌 값 반환.

  • Symbol 함수는 호출될 때마다 유일무이한 값을 생성.
  • 이때, 전역 심벌 레지스트리에서 심벌 값을 검색할 수 있는 키를 지정할 수 없으므로, 전역 심벌 레지스트리에 등록되어 관리되지 않음.
  • But, Symbol.for 메서드를 사용 시 애플리케이션 전역에서 중복되지 않는 유일무이한 심벌 값을 단 하나만 생성하여 전역 심벌 레지스트리를 통해서 공유할 수 있다.

3. 심벌과 상수

enum

  • enum은 명명된 숫자 상수의 집합으로, 열거형이라고 부름.
  • 자바스크립트는 enum을 지원하지 않지만, C, Java, Python와 TypeScript 등에서는 enum을 지원함.
  • 자바스크립트에서 enum을 사용하려면 객체 변경을 방지하기 위해 Object.freeze메서드와 함께 심벌 값을 사용함.

4. 심벌과 프로퍼티 키

심벌 값은 유일무이한 값이므로, 심벌 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않음.

  • 객체의 프로퍼티 키는 빈 문자열을 포함하는 모든 문자열 or 심벌값으로 만들수 있으며, 동적으로 생성이 가능.
  • 심벌 값을 프로퍼티 키로 사용하려면 사용할 심벌 값에 대괄호를 사용해야 함.
  • 또한, 프로퍼티에 접근할 때도 마찬가지로 대괄호를 사용해야 함.
const obj = {
	// 심벌 값으로 프로퍼티 키를 생성.
  [Symbol.for('testSymbol')]: 123
};

obj[Symbol.for('testSymbol')]; // -> 123

5. 심벌과 프로퍼티 은닉

  • 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티는 for...in문이나 object.keys, object.getOwnPropertyNames 메서드로 찾을 수 없음.
  • 심벌 값을 프로퍼티 키로 사용하여 프로퍼티를 생성할 시 프로퍼티 은닉이 가능하다.
const obj = {
	// 심벌 값으로 프로퍼티 키 생성
  [Symbol('testSymbol')]: 1
};

for (const key in obj) {
	console.log(key); // 아무것도 출력이 안됨!
};

console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertyNames(obj)); // []
  • 하지만 완벽하게 숨길 수 있는것은 아니고, ES6에서 도입 된 Object.getOwnPropertySymbols메서드를 사용하면 심벌값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있다.

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

  • 일반적으로 표준 빌트인 객체에 사용자 정의 메서드를 추가하여 확장하는것은 권장되지 않음.

  • 표준 빌트인 객체는 읽기 전용으로만 사용하는 것이 좋음.

  • 개발자가 직접 추가하는 메서드와, 미래에 표준 사양으로 추가 될 메서드의 이름이 중복될 우려가 있기 때문.

  • 하지만, 중복 될 우려가 없는 심벌 값으로 프로퍼티 키를 생성하면 어떤 프로퍼티 키와도 충돌할 우려가 없어 안전한 확장이 가능함.


7. Well-known Symbol

자바스크립트가 기본적으로 제공하는 빌트인 심벌 값을 ECMAScript 사양에서 부르는 이름.

  • Well-Known Symbol은 JS엔진 내부 알고리즘에 사용됨.

  • 궁극적으로 심벌은 중복되지 않는 상수값을 생성하는것은 물론, 기존에 작성된 코드에 영향을 주지 않고 새로운 프로퍼티를 추가하기 위해 도입되었음.

profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글