icon안동민 개발노트

Symbol, Map, Set


 ES6에서 도입된 Symbol, Map, Set은 자바스크립트의 데이터 처리 능력을 크게 향상시켰습니다.

 이 절에서는 이들 새로운 데이터 타입과 컬렉션의 특징과 사용법에 대해 자세히 알아보겠습니다.

Symbol

 Symbol은 유일하고 변경 불가능한 원시 데이터 타입입니다.

 생성 및 기본 사용법

const sym1 = Symbol();
const sym2 = Symbol('description');
console.log(sym1 === Symbol()); // false

 Symbol은 항상 유일하며, 같은 설명을 가진 Symbol이라도 서로 다릅니다.

 private 속성 구현

 Symbol을 사용하여 객체의 private 속성을 구현할 수 있습니다.

const privateProperty = Symbol('private');
class MyClass {
  constructor() {
    this[privateProperty] = 'This is private';
  }
  getPrivateProperty() {
    return this[privateProperty];
  }
}

 내장 Symbol

 자바스크립트는 여러 내장 Symbol을 제공합니다.

 예를 들어, Symbol.iterator는 객체의 이터레이터를 정의합니다.

const myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
};
 
for (let value of myIterable) {
  console.log(value);
}

Map

 Map은 키-값 쌍을 저장하는 객체입니다. 일반 객체와 달리 Map의 키는 어떤 타입이든 될 수 있습니다.

 특징 및 일반 객체와의 차이점

  • 키로 모든 타입 사용 가능 (객체 포함)
  • 키의 순서가 보장됨
  • 크기를 size 속성으로 쉽게 알 수 있음
  • 이터러블(iterable)함

 주요 메서드

const myMap = new Map();
 
// 값 설정
myMap.set('key1', 'value1');
myMap.set(42, 'value2');
 
// 값 가져오기
console.log(myMap.get('key1')); // 'value1'
 
// 키 존재 여부 확인
console.log(myMap.has(42)); // true
 
// 값 삭제
myMap.delete(42);
 
// 모든 항목 삭제
myMap.clear();
 
// 크기 확인
console.log(myMap.size);

 WeakMap

 WeakMap은 Map과 유사하지만 키로 객체만 사용할 수 있으며, 키에 대한 참조가 약하게(weakly) 유지됩니다.

const weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, 'value');
obj = null; // obj에 대한 참조가 없어지면 WeakMap에서도 자동으로 제거됨

 WeakMap은 메모리 누수를 방지하는 데 유용하며, 주로 객체와 관련된 private 데이터를 저장하는 데 사용됩니다.

Set

 Set은 중복되지 않는 값들의 집합입니다.

 특징 및 배열과의 차이점

  • 중복된 값을 저장하지 않음
  • 값의 순서가 보장됨
  • 이터러블(iterable)함

 주요 메서드

const mySet = new Set();
 
// 값 추가
mySet.add(1);
mySet.add(2);
mySet.add(2); // 무시됨
 
// 값 존재 여부 확인
console.log(mySet.has(1)); // true
 
// 값 삭제
mySet.delete(1);
 
// 모든 항목 삭제
mySet.clear();
 
// 크기 확인
console.log(mySet.size);

 WeakSet

 WeakSet은 Set과 유사하지만 객체만 저장할 수 있으며, 저장된 객체에 대한 참조가 약하게 유지됩니다.

const weakSet = new WeakSet();
let obj = {};
weakSet.add(obj);
obj = null; // obj에 대한 참조가 없어지면 WeakSet에서도 자동으로 제거됨

 WeakSet은 주로 객체가 특정 조건을 만족하는지 여부를 추적하는 데 사용됩니다.

이점 및 적절한 사용 상황

  1. Symbol
  • 이점 : 유일한 식별자 제공, 이름 충돌 방지
  • 사용 상황 : private 속성 구현, 객체 메타데이터 저장
  1. Map
  • 이점 : 키-값 쌍 관리, 성능 향상 (대규모 데이터)
  • 사용 상황 : 데이터 캐싱, 객체 간 관계 표현
  1. Set
  • 이점 : 중복 제거, 빠른 조회
  • 사용 상황 : 고유 값 목록 관리, 집합 연산
  1. WeakMap/WeakSet
  • 이점 : 메모리 누수 방지
  • 사용 상황 : 객체 관련 메타데이터 저장, 캐싱

구체적인 예시

  1. Symbol을 사용한 Enum 구현
const Color = {
  RED: Symbol('red'),
  GREEN: Symbol('green'),
  BLUE: Symbol('blue')
};
  1. Map을 사용한 사용자 세션 관리
const userSessions = new Map();
function login(userId, sessionData) {
  userSessions.set(userId, sessionData);
}
function getUserSession(userId) {
  return userSessions.get(userId);
}
  1. Set을 사용한 고유 태그 관리
const uniqueTags = new Set();
function addTag(tag) {
  uniqueTags.add(tag.toLowerCase());
}
function hasTage(tag) {
  return uniqueTags.has(tag.toLowerCase());
}

자바스크립트 성능에 미친 영향

  1. 향상된 데이터 구조화 : Symbol, Map, Set은 더 복잡하고 정교한 데이터 구조를 쉽게 구현할 수 있게 해줍니다.
  2. 성능 최적화 : Map과 Set은 대규모 데이터 처리에서 일반 객체나 배열보다 더 나은 성능을 제공할 수 있습니다.
  3. 메모리 관리 개선 : WeakMap과 WeakSet은 메모리 누수를 방지하는 데 도움을 줍니다.
  4. 코드 표현력 증가 : 이들 새로운 데이터 타입과 컬렉션은 개발자가 의도를 더 명확하게 표현할 수 있게 해줍니다.
  5. 함수형 프로그래밍 지원 : 특히 Set은 불변성과 순수 함수 개념을 쉽게 구현할 수 있게 해줍니다.

 Symbol, Map, Set의 도입은 자바스크립트의 데이터 처리 능력을 크게 향상시켰습니다. 이들은 각각 고유한 특성과 용도를 가지고 있어, 다양한 프로그래밍 상황에서 유용하게 활용될 수 있습니다.

 Symbol은 유일한 식별자를 제공함으로써, 이름 충돌 문제를 해결하고 private 속성 구현을 가능하게 했습니다. 이는 특히 라이브러리나 프레임워크 개발에서 중요한 역할을 합니다.

 Map은 키-값 쌍을 효율적으로 관리할 수 있게 해주며, 특히 키로 객체를 사용할 수 있다는 점이 큰 장점입니다. 이는 복잡한 데이터 관계를 표현하는 데 매우 유용합니다. 또한, 대규모 데이터를 다룰 때 일반 객체보다 나은 성능을 제공할 수 있습니다.

 Set은 중복 없는 값의 집합을 쉽게 관리할 수 있게 해줍니다. 이는 특히 데이터의 유일성을 보장해야 하는 상황이나 집합 연산이 필요한 경우에 유용합니다.

 WeakMap과 WeakSet은 메모리 관리 측면에서 중요한 역할을 합니다. 이들은 객체에 대한 약한 참조를 유지하여 메모리 누수를 방지하는 데 도움을 줍니다. 이는 특히 대규모 애플리케이션이나 장기 실행 프로세스에서 중요합니다.

 이러한 새로운 데이터 구조들의 도입으로 자바스크립트 개발자들은 더 정교하고 효율적인 코드를 작성할 수 있게 되었습니다. 데이터의 의미와 구조를 더 명확하게 표현할 수 있게 되었고, 이는 코드의 가독성과 유지보수성 향상으로 이어집니다.

 성능 면에서도 이들 새로운 데이터 구조는 큰 기여를 했습니다. 특히 Map과 Set은 대규모 데이터 처리에 있어 기존의 객체나 배열보다 더 나은 성능을 제공할 수 있습니다.

 결론적으로, Symbol, Map, Set의 도입은 자바스크립트를 더 강력하고 표현력 있는 언어로 발전시켰습니다. 이들은 다양한 프로그래밍 패러다임을 지원하며, 복잡한 애플리케이션 개발을 더 쉽고 효율적으로 만들어 주었습니다. 이러한 기능들을 적절히 활용함으로써, 개발자들은 더 견고하고 성능이 우수한 자바스크립트 애플리케이션을 구축할 수 있게 되었습니다.