[JavaScript] Set

Junseo Kim·2020년 7월 22일
1

set

Array를 조금 개선한 자료구조이며 중복 없이 유일한 값을 저장할 때 사용한다. 이미 존재하는지 여부를 파악할 때 많이 사용한다.

생성

let mySet = new Set();

추가

mySet.add("hi");

존재여부 확인

mySet.has("hi");

삭제

mySet.delete("hi");

순회

mySet.forEach(function(v) {
    console.log(v);
});

weakset

참조를 가지고 있는 객체만 저장 가능한 set이다.

생성은 let weakSet = new WeakSet();으로 하지만 추가, 존제 여부 확인, 삭제 등은 기본 Set과 동일하다.

차이점은 weakSet에는 숫자나 문자열과 같은 값은 넣을 수 없다. 배열과 function 같은 참조를 가지고 있는 객체만 넣을 수 있다.

let weakSet = new WeakSet();
let array = [1, 2, 3, 4];

weakSet.add(array); // true
weakSet.add(1234); // false
weakSet.add("hello"); // false
weakSet.add(null); // false
weakSet.add(function(){}); // true

weakset을 사용하는 이유는 만약 어떤 객체를 weakset에 넣은채로 객체가 null이 되거나 필요없어지면(가비지 컬렉션) 자동으로 weakset에서도 해당 객체가 존재하지 않는 것 처럼 작용한다.(값 자체는 남아있다) 이런 점을 활용하기 위해 weakset을 사용한다.

let arr = [1, 2, 3, 4];
let arr2 = [5, 6, 7, 8];
let obj = {arr, arr2};
let ws = new WeakSet();

ws.add(arr);
ws.add(arr2);
ws.add(obj);

console.log(ws); // WeakSet{{...}, Array(4), Array(4)}
                 // arr, arr2, obj가 모두 들어가있다.
                 
console.log(ws.has(arr), ws.has(arr2)); // true true

arr = null; // 가비지 컬렉션 대상

console.log(ws); // WeakSet{{...}, Array(4), Array(4)}
                 // arr, arr2, obj가 모두 들어가있다.
console.log(ws.has(arr), ws.has(arr2)); // false true
                                        // arr이 weakset에 들어가는 있지만, 가비지컬렉션이 된 이후에는 없는 것 처럼 작용하는 것을 볼 수 있다.
								

객체 형태를 중복 없이 저장하려고 할 때 유용하다.
메모리 누수에 최적화된 자료구조

0개의 댓글