집합(Set) 자료구조와 배열의 차이점

집합(Set)은 고유한 값만을 저장하는 자료구조로, 배열과 유사하지만 중요한 차이점을 가지고 있습니다.

집합과 배열의 주요 차이점

  • 고유성: 집합은 중복 값을 허용하지 않아 자동으로 중복 제거 기능을 제공합니다. 반면 배열은 동일한 값을 여러 번 포함할 수 있습니다.
  • 정렬 여부: 집합은 요소의 순서를 보장하지 않는 반면, 배열은 삽입된 순서를 유지합니다.
  • 성능 특성: 집합은 검색 작업에 최적화되어 빠른 성능을 제공하고, 배열은 순차적인 접근에 적합합니다.

집합의 기본 사용법

생성 방법

빈 집합 생성 후 요소 추가:

const uniqueCollection = new Set();
uniqueCollection.add('apple');
uniqueCollection.add('banana');
uniqueCollection.add('apple'); // 중복으로 추가되지 않음
uniqueCollection.add('orange');
console.log(uniqueCollection); // Set {'apple', 'banana', 'orange'}

배열로부터 직접 초기화:

const fruitSet = new Set(['apple', 'banana', 'apple', 'orange']);
console.log(fruitSet); // Set {'apple', 'banana', 'orange'}

핵심 메서드와 속성

  • size: 집합 내 요소 개수 확인
console.log(fruitSet.size); // 3
  • add(value): 새로운 값 추가
fruitSet.add('grape');
  • delete(value): 특정 값 제거 및 성공 여부 반환
const isDeleted = fruitSet.delete('banana');
console.log(isDeleted); // true
  • has(value): 값 존재 여부 확인
console.log(fruitSet.has('banana')); // false
  • clear(): 모든 요소 제거
fruitSet.clear();

순회 방법

  • keys(): 키 이터레이터 반환
for (const key of fruitSet.keys()) {
  console.log(key);
}
  • values(): 값 이터레이터 반환
for (const value of fruitSet.values()) {
  console.log(value);
}
  • entries(): [값, 값] 형태의 이터레이터 반환
for (const entry of fruitSet.entries()) {
  console.log(entry); // ['apple', 'apple'], ['orange', 'orange']
}
  • forEach(): 각 요소에 대해 콜백 실행
fruitSet.forEach((value, key) => {
  console.log(`${key}: ${value}`);
});
  • for...of: 이터러블 특성을 이용한 순회
for (const item of fruitSet) {
  console.log(item);
}

집합을 배열로 변환하기

스프레드 연산자 사용:

const fruitArray = [...fruitSet];
console.log(fruitArray);

Array.from() 메서드 사용:

const convertedArray = Array.from(fruitSet);
console.log(convertedArray);

복잡한 데이터 구조의 중복 제거

function removeDuplicates(dataArray) {
  const seenObjects = new Set();
  
  return dataArray.filter(element => {
    const elementKey = typeof element === 'object' && element !== null 
      ? JSON.stringify(element) 
      : element;
      
    if (seenObjects.has(elementKey)) {
      return false;
    } else {
      seenObjects.add(elementKey);
      return true;
    }
  });
}

const mixedData = [
  42,
  'test',
  {user: 'john'},
  {user: 'john'},
  {user: 'jane'},
  [5, 6],
  [7, 8],
  [5, 6],
  null,
  NaN,
  null,
  NaN
];

const uniqueData = removeDuplicates(mixedData);
console.log(uniqueData);

집합과 약한집합(WeakSet)의 차이점

  • 값의 타입: WeakSet은 객체만을 값으로 받을 수 있으며, Set은 모든 타입을 허용합니다.
  • 메모리 관리: WeakSet의 객체는 약한 참조로 처리되어 다른 참조가 없을 경우 가비지 컬렉션의 대상이 됩니다. Set의 객체는 강한 참조로 유지됩니다.
  • 제한된 기능: WeakSet은 keys(), values(), entries(), forEach() 메서드와 size 속성을 지원하지 않습니다.

태그: JavaScript set data-structure Array weakset

6월 6일 02:55에 게시됨