티스토리 뷰
안녕하세요. 좋아요요정입니다.
오늘은 ES6에 도입된 Map과 Set에 대해 알아보겠습니다.
컬렉션?
컬렉션이란 데이터들의 집합, 데이터를 모아놓은 자료구조의 개념입니다. 자바스크립트에서 컬렉션으로 잘 사용하는 데이터 타입은 객체입니다. 객체는 key와 value를 하나씩 쌍으로 가진 프로퍼티를 끊임없이 추가할 수 있는 컬렉션입니다.
Map과 Set은 ES6에서 도입된 새로운 컬렉션입니다. Map은 Map 객체로 키-값 쌍을 보유하는 형태의 자료구조이고, Set객체는 자료형에 관계 없이 원시 값과 객체 참조 모두의 유일한 값을 저장하는 형태의 자료구조입니다.
자바스크립트는 객체로 자료구조가 가능한데 왜 Map과 Set이라는 새로운 자료구조를 도입했을까요?
도입한 이유는 일반 객체로는 해결할 수 없는 문제들이 있기 때문입니다.
1. 검색 케이블로 사용중인 객체에 메소드를 추가하는 경우, 이름 충돌의 위험을 감수해야 합니다.
2. 객체의 key값은 항상 문자열입니다. 특히, 속성의 key로 객체를 사용할 수 없습니다.
3. 객체에 얼마나 많은 속성들이 존재하는지 알아낼 수 있는 효율적인 방법이 없습니다.
4. 또한, 일반 객체는 이터러블 하지 않아 for of나 . . . 을 사용할 수 없습니다. (Object.keys()를 이용해 순회했음)
따라서 위와 같은 문제들을 해결하기 위해 Map과 Set이 도입되었습니다.
Map
Map 객체는 키-값 쌍을 보유하고 원래 삽입 순서를 기억합니다. 또한 문자열과 심볼만을 key로 가지는 객체와는 다르게 다양한 자료형을 key값으로 사용할 수 있다는 특징을 가지고 있습니다.
그리고 자료를 저장, 가져오는 방식이 다릅니다. 객체에서는 값에 접근할 때 object[key], object.key의 방법으로 접근해 생성, 수정, 가져올 수 있었습니다. Map은 get(), set(), has(), delete(), 등의 메서드를 이용해 자료를 등록하고 삭제, 가져오기 등을 할 수 있습니다.
Map 객체 생성
const map = new Map()
Map 객체를 생성할 때에는 new키워드를 이용해 생성할 수 있습니다.
데이터 저장
map.set(key, value);
map.set('1', '문자열 1');
map.set(1, '숫자열 1');
map.set([1,2,3], '배열');
set메서드를 이용해 key, value를 저장해줄 수 있습니다. Map의 키는 함수, 객체, 배열 등 모든 기본 요소를 포함해 어떤 값이든 사용하실 수 있습니다. 객체와 마찬가지로 중복되는 키는 사용할 수 없습니다.
기존에 등록되어있던 key값을 set할 경우 새로운 값으로 재할당됩니다.
데이터 가져오기(반환)
map.get(key)
map.get(1) //'숫자형 1'
map.get('1') //'문자열 1'
map.get([1,2,3]) //'배열'
get메서드를 이용해 value를 가져올 수 있습니다. key에 해당하는 값을 반환하며 존재하지 않으면 undefined를 반환합니다.
key존재유무 확인
map.has(key)
map.has(1) //true
map.has(2) //false
has메서드를 이용합니다. key가 존재하면 true, 존재하지 않으면 false를 반환합니다.
key-value 삭제
map.delete(key)
map.delete(1)
delete메서드를 이용해 key에 해당하는 값을 삭제합니다.
모든 key-value 제거
map.clear()
clear메서드를 이용해 맵 안의 모든 요소를 제거하여 빈 Map객체로 만듭니다.
map내부 개수 확인
map.size;
size메서드를 이용하면 map 내부의 key-value 쌍의 개수를 확인해 반환합니다.
Map의 iterable
자바스크립트의 객체의 경우 반복 프로토콜을 구현하지 않으므로 for of 문을 사용하거나 Object.keys(객체명), Object.entries(객체명)를 사용하여 반복에 필요한 배열목록을 반환받아 사용할 수 있었습니다.
Map은 keys, values, entries-next 메서드를 가지고 있어서 map 암의 프로퍼티들을 순회할 수 있는 이터러블 객체를 반환받아 사용할 수 있습니다.
예제를 위해 하나의 Map 객체를 생성해보겠습니다.
const cats = new Map([[1, "cookie"],[2, "latte"]]);
key 나열
cats.keys()
value 나열
cats.values()
하나의 키-값 쌍을 반환하는 entries()
const iterObj = cats.entries()
iterObj.next()
iterObj.next()
iterObj.next()
next로 다음 항목을 반환, 순회가 끝나면 done: frue값을 반환합니다.
Set
두번째 새로운 자료구조 Set을 살펴보겠습니다.
Set은 값으로만 이루어진 형태의 컬렉션입니다. 배열과 같이 [ 값, 값, 값 ] 형태로 나열되어져 있습니다.
배열과 다른 점은 "같은 값을 한개 이상 포함할 수 없다."는 것입니다. 배열은 인덱스로 해당 위치에 값이 저장되어 중복되는 값도 입력이 가능합니다.
const arr = ['1','1','1']
Set에 동일한 배열을 입력하면 어떻게 될까요?
const mySet = new Set(['1','1','1']);
Set의 이러한 특징으로 중복되는 사항들을 제거하기 위해 많이 사용합니다.
Set은 Map과 마찬가지로 메서드를 사용해 자료를 저장하고 순회하고 삭제할 수 있습니다.
Set 객체 생성
const mySet = new Set();
데이터 저장
mySet.add(1);
mySet.add({"22":"hi"})
총 수량 확인
mySet.size;
데이터 삭제
mySet.delete(1)
데이터 유무 확인
mySet.has(1)
전체 지우기
mySet.clear()
자바스크립트 파트는 지났지만, 지금 안 남겨두면 까먹을까봐 하나씩 정리할 예정!
Map과 Set 제 눈에는 왜이렇게 멋있을까요?
배열과 객체를 늘 쓰던대로 쓰다가 보니 더 간결하고 멋져보이고 활용하고 싶다는 생각이 드네요 ㅎㅎ (새로워요)
1,2월 스터디를 진행하며 시간이 더딘듯 빠릅니다 :) 스터디는 꾸준히 순항중~~!! 스터디원분들 훈님 감사합니다!!
오늘도 행복한 코딩라이프되세요~~!
JavaScript 스터디 팀 러버덕과 함께 합니다.
- Total
- Today
- Yesterday
- 코딩테스트
- 함수
- 프로토타입
- 자바스크립트
- 리액트
- 복제
- 면접
- 상속
- 스터디
- 파이썬
- 프론트엔드
- JavaScript
- 메서드
- 팀러버덕
- 프로그래머스
- 타이핑
- Prototype
- 생성자함수
- 스택
- JS
- 프로퍼티
- 타이핑효과
- Python
- this
- react
- SET
- 면접대비
- 선언
- 객체
- Call
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |