ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 항해 99 - Map, Set 자료구조
    Front End/css, html, JS 2023. 4. 10. 22:28

    오늘은 익숙한 구조일 줄 알았던 Map과 익숙한 구조 그 자체였던 Set에 대해 공부했다.

    정말 Set은 사용하는 메소드와 식이 달라서 그렇지 사실 개념은 집합에서 크게 벗어나지 않았다.

    Map은 엥? 이게 뭐지? 객체랑 뭐가 다르지? 라는 생각이 드는 자료구조이다.

     


    1. Map()

    위에서 말한것처럼 객체와 크게 다르게 생기지 않은 자료구조이다.

    객체와 차이점이 있다면 key값에 변수명(즉, 문자형)만 허용했던 객체와 달리,

    Map 자료형의 key값에는 다양한 자료형(예. 숫자형, 문자형, boolean 등)이 가능하다는 것이다.

    Map() 자료형에 대한 다양한 메소드들을 정리해보자.

    // Map 자료형 선언
    const myMap = new Map();
    
    // Map에 데이터 insert, key를 이용해 value를 저장
    myMap.set('key', 'value');          
    
    // 특정 key에 해당하는 값을 반환
    // key가 존재하지 않으면 undefined를 반환
    console.log(myMap.get('key'));
    
    // key의 존재 유무 확인
    // 존재하면 true, 존재하지 않으면 false
    console.log(myMap.has('key'));
    
    // key에 해당하는 pair 삭제
    console.log(myMap.delete('key'));
    
    // key 초기화, 모든 요소 제거
    myMap.clear();
    
    // 요소의 개수 반환
    console.log(myMap.size);

     

    Map은 키가 정렬된 순서대로 저장이 되며, 반복이 굉장히 중요하다.

    keys(), values(), entries() 를 사용하는 간단한 예시를 살펴보자.

    const myMap = new Map();
    myMap.set('one', 1);
    myMap.set('two', 2);
    myMap.set('three', 3);
    
    // keys
    console.log(myMap.keys())
    for (const key of myMap.keys()) {
        console.log(key);
    }
    // 결과
    // one
    // two
    // three
    
    
    // values
    console.log(myMap.values())
    for (const value of myMap.values()) {
        console.log(value);
    }
    // 결과
    // 1
    // 2
    // 3
    
    
    // entries
    console.log(myMap.entries())
    for (const [key, value] of myMap.entries()) {
        console.log(key, value);
    }
    // 결과
    // one 1
    // two 2
    // three 3

     

    key-value 페어를 갖는 객체와 Map() 자료형은 서로 변환하여 사용할 수 있다.

    객체에서 Map()으로 변환 : new Map(Object.entries(객체))

    Map()에서 객체로 변환 : Object.fromEntries(Map자료.entries())

    // 객체 -> Map()
    let user = {
      name: "댕근",
      age: 28
    };
    let userMap = new Map(Object.entries(user));
    
    alert(userMap.get('name')); // 댕근
    
    
    // Map() -> 객체
    let fruitMap = new Map();
    fruitMap.set('banana', 1);
    fruitMap.set('orange', 2);
    fruitMap.set('apple', 4);
    
    let fruitObj = Object.fromEntries(fruitMap.entries());
    // fruitObj = { banana: 1, orange: 2, meat: 4 }
    
    alert(obj.orange); // 2

     

     

    2. Set()

    앞서 말한 것 처럼 Set()은 집합과 같은 개념이다.

    python에서도 자주 사용한 자료구조인데, 중복을 제거하기에 가장 효과적인 구조라고 할 수 있다.

    Set()은 고유한 값만을 저장하기 때문에 값이 중복되서 들어오면 덮어쓰기가 된다.

    또한 키를 저장하지 않고, 값만을 저장한다.

     

    Set() 자료형에 대한 메소드 부터 살펴보자.

    // Set() 자료형 선언
    const mySet = new Set();
    
    // 요소 추가
    mySet.add('values1');
    mySet.add('values2');
    mySet.add('values3');
    
    // Set 크기
    console.log(mySet.size);
    
    // 요소의 존재 유무 확인
    // 존재하면 true, 존재하지 않으면 false
    console.log(mySet.has('values1'));   // true
    
    // 해당 요소 삭제
    // 삭제에 성공하면 true, 실패하면 false 반환
    console.log(mySet.delete('values1'));
    
    // Set 초기화
    mySet.clear()

     

    Set()도 Map()과 마찬가지로 Iterator가 가능합니다.

    const mySet = new Set();
    mySet.add('values1');
    mySet.add('values2');
    mySet.add('values3');
    mySet.add('values5');
    mySet.add('values8');
    mySet.add('values4');
    
    // Set은 key가 없기 때문에 values만 값이 있습니다.
    for (const value of mySet.values()) {
        console.log(value)
    }
    // 결과
    // values1
    // values2
    // values3
    // values5
    // values8
    // values4

     


    Set 자료형은 많이 쓰던 자료형이기 때문에 어디서 써야할지 대충 감이 오는데 사실 Map 자료형은 어디서 써야할지 아직 감이 오지 않는다. 실전에서 사용하는 코드들을 찾아보면서 익혀야겠다.

    댓글

Designed by Tistory.