ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ES6] Set vs Array 비교 [번역]
    맨땅에코딩/javascript 2020. 8. 7. 17:48

    [Set은 뭐고 Array는 뭐야?]

    JS로 작업을 해본 누구나 Array는 아주 익숙할거야. 하지만 정확하게 Array는 뭘까?

     

    일반적으로 Array는 데이터 덩어리(?) 표현하는 구조적 유형이다.(숫자,객체들 등등..) 연속적인 메모리에 할당되어있어.

     

    예시로 : [1,2,3,2]

     

    그렇다면 Set은?

     

    Set은 좀더 수학적 발상으로서, index에 의해 순서적으로 할당될 필요없이 중복없는 요소들/객체들만 포함하는 추상적인 데이터 유형이다.

     

    예시로 : {1,2,3}

     

    맞아, 정의에 의하면, Array와 Set은 기술적으로 다른 개념이야.

     

    가장 큰 차이점중 하나는, Array는 중복될 수 있다는 점이야. 하지만 Set은 그렇지 않아.

     

    게다가, Array는 "인덱스 콜렉션" 이고, Set은  "키 콜렉션" 이야.

     

    • 인덱스 콜렉션 : index value에 의해 순서화되는 데이터 콜렉션
    • 키 콜렉션 : key를 사용하는 콜렉션; 포함된 요소들은 입력의 순서에서 반복가능하다.

    아니, 그럼 이렇게 다른데 왜 둘을 비교하는 걸까?

     

    프로그래밍 세계에서, 같은 데이터를 취할때, Array 나 Set으로 데이터를 저장할 수 있어.

    올바른 구조를 선택하는 것은 최선의 방법을 전달하는데 기여할 수 있어 

    -  무엇을 선택할지 이해하기 위해서는, 먼저 그들이 무엇인지, 어떻게 많들어지는지 그리고 무엇을 할 수 있는지

    에 대해 이해해야해. 

     

    [생성하기]

    Array 

    Array는 매우 간단하게 선언할 수 있어.

    var arr = []; //Empty array
    var arr = [1,2,3]; //Array which contains 1,2,3

    아니면 내장된 생성자로

    var arr = new Array(); //empty array
    var arr = new Array(1,2,3);//Array which contains 1,2,3 

    아니면 

    var arr = Array.from("123"); //["1","2","3"]

    ※ 알아둘 것 :

    new Array()는 정말x3 필요하지 않으면 쓰지마, 왜냐하면 :

    • 기본 [] 선언보다 아주 많이 느려
    • [] 가 더 타이핑할때 빨라
    • 아래와 같은 실수를 할 수가 있어
    var arr1 = new Array(10); //arr1[0] = undefined but arr1.length = 10
    var arr2 = [10]; // arr2[0] = 10 and arr2.length = 1;
    var arr3 = new Array(1,2,3); //[1,2,3]
    var arr4 = [1,2,3];//[1,2,3] 

     

    Set

    Set은 내장형 생성자로만 생성할 수 있어. 단축키는 없듬

    Set은 iterable한 객체만 인자로 받기 때문에  " new Set(1); " 이런식으로는 불가능해

    아래의 방법처럼 Array.from을 사용해서도 가능해

    var set = new Set([1,2,3]); // {1,2,3}
    var arr = Array.from(set);//[1,2,3]

     

    [요소에 접근하기]

    • Set은 Array처럼 index로 임의의 접근이 불가능해 
    console.log(set[0]); //undefined
    console.log(arr[0]); //1
    • 더욱이, Array 데이터는 연속적 메모리 공간에 저장되기 때문에, CPU는 pre-fetching해서 데이터 접근을 더욱 빨리 할 수 있어. 따라서 일반적으로 Array에서 접근은 다른 추상적 데이터 유형과 비교해서 더 빠르고, 더 효율적이야
    • Set은 Array보다 element를 체크하는데 있어서 더 간단한 문법을 가지고 있어 Set.prototype.has(value) vs Array.prototype.indexOf(value)
    console.log(set.has(0)); // boolean - false
    console.log(arr.indexOf(0)); // -1
    console.log(set.has(1)); //true
    console.log(arr.indexOf(1)); //0
    // 요소가 Array에 존재하는지 여부
    var isExist = arr.indexOf(1) !== -1;
    • ES6에서 Array.prototype.includes()로 has()와 비슷하게 사용할 수 있어. 

     

    [요소에 추가/삽입하기]

    • Array.prototype.push() 로 배열의 끝에 요소를 빠르게 추가할 수 있어.
    • Array.prototype.unshift() 로 배열의 시작에 요소를 추가할 수 있어.
    arr.push(4); //[1,2,3,4]
    
    arr.unshift(3); //[3,1,2,3]
    arr.unshift(5, 6); //[5,6,3,1,2,3]
    • Set에서는 Set.prototype.add() 만 사용할 수 있어. 왜냐하면 Set은 "중복없는" 프로퍼티를 유지해야해서, add()를 호출할때마다 Set은 모든 요소들의 중복이 없는지 확인을 해야해.   
    set.add(3); //{1,2,3} 
    set.add(4); //{1,2,3,4}

     

    [요소 삭제하기]

    Array

    • pop() -마지막 요소를 제거하고 제거된 요소를 반환
    • shift() - 첫번째 요소를 제거하고 제거된 요소를 반환
    • splice(index,deleteCount) - index번째부터 deleteCount만큼 삭제

    Set

    • delete(element) - 특정 요소를 Set으로부터 제거
    • clear() - 모든 요소를 Set으로부터 제거

    [그래서, 언제 Set이 좋아? Array는 언제 좋아?]

    • Set은 중복되지않은 요소들을 가지기때문에 중복된 데이터를 저장하지 않고싶을때 좋아
    • Set의 기본동작은 union(), intersect(), difference() 등등과 같아. 얘네는 내장된 동작을 통해 쉽게 이행되지. delete() 메소드 덕분에, 2 Set을 사용하는 것이 훨씬 편해
    • Array는 요소들을 순서대로 유지하여 빠른 접근 혹은 큰 수정 혹은 인덱스로 요소의 직접적인 접근을 하는 모든 동작시에 의미가 있어. (Set을 사용한다면, 중간에 위치한 요소를 어떻게 접근할거야?..

    [결론]

    일반적으로, Set은  "중복되지않은" 데이터를 최소한의 노력으로 유지하기를 원할때 빼고는, Array보다 그렇게 크고 확실한 이점을 갖고 있지는 않아. 반면에, Array는  항상 선택되지. 이유가 뭐냐고? 적은 CPU 사용으로 필요할때 요소를 가져올 수 있어.

     

     

    [원문]

    https://medium.com/front-end-weekly/es6-set-vs-array-what-and-when-efc055655e1a

    '맨땅에코딩 > javascript' 카테고리의 다른 글

    apply,call,bind 비교  (0) 2020.09.11
    [ES6] WeakSet vs Set [번역]  (0) 2020.08.09
    [ES6] WeakMap vs Map [번역]  (0) 2020.08.09
    [ES6] Map vs Object 비교 [번역]  (0) 2020.08.07
    [ES6] var, let, const 비교  (0) 2020.06.26
Designed by Tistory.