안녕하세요 씨즈입니다:)
오늘은 자료구조에 대해서 알아봅시다!
데이터에 맞는 적절한 자료구조를 사용하는 것은 전체 개발 시스템에 굉장히 큰 영향을 끼치기 때문입니다.
예를 들어 여성분들이 화장품을 담기에 효율적인 것은 캐리어? 백팩? 에코백? 파우치?
정답은 파우치입니다. 화장품 몇 개를 담으려고 캐리어를 갖고 다닌다면 얼마나 무겁고 힘들겠어요
정말 비효율적이죠?
캐리어는 언제 사용할까요? 해외 여행을 가는 경우처럼 많은 양의 짐을 한 번에 이동시킬 때 사용하죠
키를 사용해 식별할 수 있는 값을 담은 컬렉션은 객체라는 자료구조를 이용해 저장합니다. 객체만으로도 다양한 작업을 할 수 있지만 개발을 진행하다보면 첫 번째 요소, 두 번째 요소, 세 번째 요소 등과 같이 순서가 있는 컬렉션이 필요할 때가 생깁니다.
이처럼 순서가 있는 컬렉션을 저장할 때 쓰는 자료구조가 배열 Array 입니다.
아래 두 문법을 사용하면 빈 배열을 만들 수 있습니다.
1. let arr = new Array(); 2. let arr = [];
대부분 두 번째 방법으로 배열을 선언하는데, 이때 대괄호 안에 초기 요소를 넣어주는 것도 가능합니다.
let fruits = ["사과", "오렌지", "자두"];
큐(queue)는 배열을 사용해 만들 수 있는 대표적인 자료구조로, 배열과 마찬가지로 순서가 있는 컬렉션을 저장하는 데 사용합니다.
아래처럼 배열을 사용해서 간단하게 큐를 구현할 수 있습니다.
class Queue { constructor() { this._arr = []; } enqueue(item) { this._arr.push(item); } dequeue() { return this._arr.shift(); } } const queue = new Queue(); queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); queue.dequeue(); // 1
스택을 사용하면 가장 나중에 집어넣은 요소가 먼저 나옵니다. 이런 특징을 줄여서 후입선출(Last-In-First-Out, LIFO)이라고 부릅니다.
큐와 마찬가지로 배열을 사용해서 스택을 구현할 수 있습니다.
class Stack { constructor() { this._arr = []; } push(item) { this._arr.push(item); } pop() { return this._arr.pop(); } peek() { return this._arr[this._arr.length - 1]; } } const stack = new Stack(); stack.push(1); stack.push(2); stack.push(3); stack.pop(); // 3
트리는 노드로 이루어진 자료 구조입니다. 앞서 보인 큐, 스택은 선형 주로의 자료 구조입니다. 선형 구조란 자료를 구성하고 있는 데이터들이 순차적으로 나열시킨 형태를 의미하는데 트리는 비선형 구조입니다. 비선형 구조는 선형구조와는 다르게 데이터가 계층적으로 구성 되어있습니다.
선형구조와 비선형구조의 차이점은 구성형태뿐만 아니라 용도에서도 차이점이 들어나는데, 선형구조는 자료를 저장하고 꺼내는 것에 초점이 맞춰져 있고, 비선형구조는 포현에 초점이 맞춰져 있습니다.
컴퓨터의 directory 구조가 트리의 대표적인 예가 될 수 있습니다.
>관련 용어
맵은 키가 있는 데이터를 저장한다는 점에서 객체와 유사합니다. 다만, 맵은 키에 다양한 자료형을 허용한다는 점에서 차이가 있습니다.
맵에는 다음과 같은 주요 메서드와 프로퍼티가 있습니니다.
예시:
let map = new Map(); map.set('1', 'str1'); // 문자형 키 map.set(1, 'num1'); // 숫자형 키 map.ste(true, 'bool1') // 불린형 키 // 객체는 키를 문자형으로 변환시킵니다. // 맵은 키의 타입을 변환시키지 않고 그대로 유지합니다. 따라서 아래의 코드는 출력되는 값이 다릅니다. alert(map.get(1)); // 'num1' alert(map.get('1')); // 'str1' alert(map.size); // 3
-맵은 키로 객체를 허용합니다. 객체를 키로 사용할 수 있다는 점은 맵의 가장 중요한 기능 중 하나입니다. 객체에는 문자열 키를 사용할 수 있지만 객체 키는 사용할 수 없습니다.
셋은 중복을 허용하지 않는 값을 모아놓은 특별한 컬렉션입니다.
주요 메서드는 다음과 같습니다.
방문자 방명록을 만든다고 가정해 봅시다. 한 방문자가 여러 번 방문해도 방문자를 중복해서 기록하지 않겠다고 결정 내린 상황입니다. 즉, 한 방문자는 '단 한 번만 기록’되어야 합니다.
이때 적합한 자료구조가 바로 셋입니다.
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// 어떤 고객(john, mary)은 여러 번 방문할 수 있습니다.
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
//셋에는 유일무이한 값만 저장됩니다.
alert(set.size); // 3
for (let user of set) {
alert(user.name); // John, Pete, Mary 순으로 출력됩니다.
}
제 글이 조금이라도 도움이 되었으면 좋겠습니다.
읽어주셔서 감사합니다.
Seize the day!