[JS] class와 Array 객체를 이용하여 Stack과 Queue를 구현하시오.

준리·2022년 8월 17일
0
post-thumbnail

class와 Array 객체를 이용하여 Stack과 Queue를 구현하시오.

// ex1) Stack
const stack = new Stack(); // or new Stack([1,2]); // (1,2)
stack.push(3); // 추가하기
console.log(stack.pop()); // 마지막에 추가된 하나 꺼내기

// ex2) Queue
const queue = new Queue();
queue.enqueue(3); // 추가하기
console.log(queue.dequeue()); 
// 추가한지 가장 오래된 - 먼저 들어간 - 하나 꺼내기

문제정의😋

함수형프로그래밍언어 자바스크립트에서 클래스란?

Class는 객체를 생성하기 위한 템플릿입니다. 클래스는 데이터와 이를 조작하는 코드를 하나로 추상화합니다. 자바스크립트에서 클래스는 프로토타입을 이용해서 만들어졌지만 ES5의 클래스 의미와는 다른 문법과 의미를 가집니다.

JS에선 클래스도 함수이다.

은닉성 // 캡슐화, 내부(local) 변수 및 메소드 보호 (private / protected / public)
상속성 // 확장성 (extends, mixin, prototype), superclass & subclass
다형성 // polymorphism, interface / super class, 추상화 // 제일중요

이 Class를 활용해 stack과 queue(참고)를 만들어보자.

Stack // LIFO: Last In, First Out
Queue // FIFO : Frist In, First Out

Stack : LIFO

class Stack {
    constructor(arr = []) {
        this.arr = arr;
    }
    push(value) {
        return this.arr.push(value);
    }

    pop() {
        return this.arr.pop();
    }
}
const stack = new Stack([1, 2]);
stack.push(3); // 추가하기 
console.log(stack); // [1, 2, 3]
console.log(stack.pop()); // 3
console.log(stack); // [1, 2]

Stack 클래스를 만들고 제일 먼저 Constructor 건설자라고 불리우는 놈을 만들어야 한다.

  // instance(this) + prototype 생성! (무엇보다 먼저 실행!)    
constructor(arr = []) {
        this.arr = arr;
    }

클래스를 생성할 때 무엇보다 먼저 실행되며 instance의 this를 가지고 프로토타입을 생성한다. 쉽게 생각하면 (추가 가능한) 주조틀 이라고 생각하면 된다. 초기 설정이랄까

constructor 메서드는 클래스의 인스턴스 객체를 생성하고 초기화하는 특별한 메서드입니다.

constructor를 만든 상태에서 const stack = new Stack([1, 2]); 실행하게 되면 Stack { arr: [ 1, 2] } 할당된 클래스가 보인다.

그 다음에 해야할 일은 push & pop메서드를 만드는 일이다. stack.push(3); 3을 인자로 넣었을 때 배열에 3이 추가되게 하고 싶다. stack.pop() 했을 때 마지막 인덱스값을 출력하고 제거하고 싶다.
거창하게 하지말고 Array의 메서드를 사용하자.

    push(value) {
        return this.arr.push(value);
    }

    pop() {
        return this.arr.pop();
    }

stack.push(3); // 추가하기 
console.log(stack); // [1, 2, 3]
console.log(stack.pop()); // 3
console.log(stack); // [1, 2]

Queue : FIFO

class Queue {
  constructor(arr = []) {
        this.arr = arr;
    }
    enqueue(value) {
        return this.arr.push(value);
    }

    dequeue() {
        return this.arr.shift();
    }
}

const queue = new Queue([5, 4]);
queue.enqueue(3); // 추가하기
console.log(queue); // [5, 4, 3]
console.log(queue.dequeue()); // 추가한지 가장 오래된 - 먼저 들어간 - 하나 꺼내기 // 5
console.log(queue); // [4, 3]

queue는 사실 볼 것도 없다. Stack과 비슷하게 진행되기 때문이다.
dequeue()메서드를 제외하고는 동일한 부분이 많다. 이를 해결할 방법이 있을까?

결론

class는 결국 중복을 제거해 효율을 높이고자 하는 면에서 function type이란 것에 공감한다. 각각의 class를 만들었을 땐 몰랐던 class의 진짜 기능을 사용해야한다.

다음 장에서는 은닉성 / 상속성 / 다형성을 추가해 class를 구현해보고자 한다.
class를 쓰면 좋은 이유를 확실히 보여주겠다.

출처

SSAC 영등포 교육기관에서 풀스택 실무 프로젝트 과정을 수강하고 있다. JS전반을 깊이 있게 배우고 실무에 사용되는 프로젝트를 다룬다. 앞으로 그 과정 중의 내용을 블로그에 다루고자 한다.

profile
트렌디 풀스택 개발자

0개의 댓글