큐(Queue)란 무엇인가

• 큐(queue)는 먼저 삽입된 데이터가 먼저 추출되는 자료구조(data structure)다.
• 예시) 버스 정류장에서 먼저 줄을 선 사람이 먼저 버스를 탄다
알바할 때 공기밥을 미리 퍼놓고 보관함에 넣어놨더니 사장님 왈 "선입선출로 정리해!"

큐(Queue)는 왜 필요한가

스택(stack)과 더불어서 큐(Queue)는 코드를 작성할 때(코딩 테스트를 포함) 정말 자주 쓰이는 필수 자료구조이다.

1️⃣ 실제 코드를 구현할 때 실생활과 매우 밀접하다.

  • 은행 창구나 식당 대기줄처럼 "먼저 온 사람이 먼저 서비스 받는" 상황 구현
  • 프린터 인쇄 대기열: 문서들이 순서대로 처리됨
  • 콜센터 고객 대기: 먼저 건 전화가 먼저 상담원과 연결

2️⃣ 프로그래밍 로직 구현에 자주 사용된다.

  • 비동기 작업 처리: 이벤트나 요청을 순차적으로 처리
  • 버퍼링: 영상/음악 스트리밍에서 데이터를 순차적으로 처리
  • BFS(너비 우선 탐색) 알고리즘 구현
  • 프로세스 스케줄링: 운영체제에서 작업 순서 관리

3️⃣ 장점

  • 데이터의 순서가 보장됨 (FIFO: First In First Out)
  • 구현이 간단하고 직관적
  • 메모리 관리가 효율적

큐(Queue)의 구조

필요에 따라 삽입과 삭제를 이용하여 데이터를 다룰 수 있다.
선입선출이라고 보면 된다.

JavaScript로 큐(Queue) 구현

JavaScript에서는 파이썬의 Dictionary 자료형(JS에는 이와 비슷한 것 으로 객체 리터럴)을 이용하여 큐(queue)를 구현하면 간단하다.

class Queue {
  constructor() {
    this.items = {};
    this.headIndex = 0;
    this.tailIndex = 0;
  }
  enqueue(item) {
    this.items[this.tailIndex] = item;
    this.tailIndex++;
  }
  dequeue() {
    const item = this.items[this.headIndex];
    delete this.items[this.headIndex];
    this.headIndex++;
    return item;
  }
  peek() {
    return this.items[this.headIndex];
  }
  getLength() {
    return this.tailIndex - this.headIndex;
  }
}


// 구현된 큐(Queue) 라이브러리 사용
queue = new Queue();
// 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7)
// - 삭제() - 삽입(1) - 삽입(4) - 삭제()
queue.enqueue(5);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(7);
queue.dequeue();
queue.enqueue(1);
queue.enqueue(4);
queue.dequeue();
// 먼저 들어온 순서대로 출력
while (queue.getLength() != 0) {
console.log(queue.dequeue());
}

// 결과
// 3
// 7
// 1
// 4

마무리

사실 자바스크립트를 사용하다보면 웬만하면 처음으로 사용하는 자료구조가 스택(stack)이다.
그런데 스택을 사용하다보면 "왜 반대로 선입선출 방식은 없지? 왜 지원을 안 하지?" 이런 생각이 들 것이다.
이런 식으로 직접 큐(Queue)를 구현하면 선입선출도 사용 가능하다!

프론트에서는 사실 리액트가 지배하는 세상이라 함수형 프로그래밍만 하면 되기 대문에 class로 구현하는 것이 익숙치 않을 수 있는데, 사실 요즘 프론트는 프론트만 해서는 살아남을 수 없다. 그런의미로 class도 익숙해지자.

profile
frontend

0개의 댓글