[javascript] make stack without Array
배경
TDD를 공부하기 위해서 열심히 유튜브를 통해 jest 사용법을 공부하고 있는 와중. 충격을 먹은 부분이 있어서 잊지 않고자 블로그에 포스팅해보려고 한다.
바로 배열 없이 스택 구ㅡ현하기!!
설정부터 시작
우선 기본적인 설정부터 해보자. 일반적은 node js 환경에서 test를 돌리는 것이기 때문에, jest
와 @types/jest
가 필요하다. npm init
을 커맨드에 작성하고 두 라이브러리를 다운받아 주자.
그 후 package.json
을 다음과 같이 바꿔주자.
{
"test" : jest --watchAll --verbose --coverage
}
- watchAll : 저장하면 runs all tests
- verbose : test 결과 상세 내역을 보여준다.
- coverage : test의 어떤 부분이 빠졌는지 표로 보여준다.
배열 없이 스택 만들기
위와 같이 구성을 하면 이제 TDD로 배열 없이 배열 만들기 준비가 끝났다. 배열 없는 배열 팀
stack의 기본 틀 잡기
describe('배열 만들기',()=>{
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
});
it('스택 top에 push?');
it('pop도 가능?');
});
TDD의 기본 방향은 우선 틀린 테스트 케이스 작성
-> 고쳐서 작동하게 만들기
-> 반복이다.
위처럼 코드를 짜서 test를 돌려보면 당연히 fail이다. Stack이 정의되지 않았기 때문. stack을 구현해준다.
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
}
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?');
it('pop도 가능?');
});
test가 끝난 후 다음 번 test를 진행하기 전에 initialize가 필요하다.
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?');
it('pop도 가능?');
});
stack의 매서드 만들기
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?');
});
stack의 push에 대한 test case 먼저 작성
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
get peek() {
return this.items[this.top];
}
push(value){
this.top += 1;
this.items[this.top] = value;
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?');
});
pop 구현
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
get peek() {
return this.items[this.top];
}
push(value){
this.top += 1;
this.items[this.top] = value;
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?',() => {
stack.push('haha');
stack.pop();
expect(stack.top).toBe(-1);
exprect(stack.peek).toBe(undefined);
});
});
test case 기반으로 구현한다.
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
get peek() {
return this.items[this.top];
}
push(value){
this.top += 1;
this.items[this.top] = value;
}
pop(){
this.top -= 1;
delete this.items[this.top];
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?',() => {
stack.push('haha');
stack.pop();
expect(stack.top).toBe(-1);
exprect(stack.peek).toBe(undefined);
});
});
정리
- 내가 자연스럽게 썼던 무언가 역시 어떠한 구현으로 만들어진 것이라는 것이 새삼 충격이었다.
- 새로운 무언가를 정의하고 만들 때는
class
를 항상 기억하자.
참고
https://www.youtube.com/watch?v=Jv2uxzhPFl4&t=610s
Author And Source
이 문제에 관하여([javascript] make stack without Array), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@raverana96/javascript-make-stack-without-Array저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)