본문 바로가기

Javascript/Javascript(ES6)

ES6 javascript로 자료구조 List 구현하기 (배웠으면 사용해보자!!)

반응형

DataStructures and Algorithms with javascript

책 "자바스크립트 자료구조와 알고리즘"을 보고 리스트 구현을 ES6로 해보는 연습이다.

책에서는 ES5 문법이므로 보고 ES6로 바꾸는 과정이 있다.

[전체 코드]

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//ES6 List 클래스 만들기
class List{
  constructor(){
    this.listSize = 0;
    this.pos = 0;
    this.dataStore = [];
  }
  //get 키워드 활용 -> 사용은 .length로 변수처럼 사용
  get length(){
    return this.listSize;
  }
  //뒤에 요소 삽입
  append(element){
    this.dataStore[this.listSize] = element;
    this.listSize++;
  }
  //요소 검색 후 인덱스 리턴
  find(element){
    for(let i=0;i<this.listSize;i++){
      if(element === this.dataStore[i]){
        return i;
      }
    }
    return -1;
    /*
    //for~in문을 사용하니까 결과값이 'String' 타입...
    for(val in this.dataStore){
      if(element === this.dataStore[val]){
        return val;
      }
    }
    */
  }
  //요소 제거
  remove(element){
    let foundAt = this.find(element);
    if(foundAt > -1){
      this.dataStore.splice(foundAt,1);//해당 배열 요소 삭제
      --this.listSize;//크기 1개 축소
      return true;
    }
    return false;
  }
  //리스트 요소 출력
  toString(){
    return this.dataStore;
  }
  //특정 위치 다음에 요소 삽입
  insert(element,after){
    let insertPos = this.find(after);
    if(insertPos > -1){
      this.dataStore.splice(insertPos+10, element);
      this.listSize++;
      return true;
    }
    return false;
  }
  //리스트 전체 삭제
  clear(){
    this.dataStore = []; //delete 즉시 배열을 삭제하고 빈 배열 재생성
    this.listSize = this.pos = 0;
  }
  //리스트에 특정값이 있는지 판단
  contains(element){
    for(let i = 0; i<this.listSize;i++){
      if(this.dataStore[i] === element){
        return true;
      }
    }
    return false;
  }
  front(){
    this.pos = 0;
  }
  end(){
    this.pos = this.listSize-1;
  }
  prev(){
    if(this.pos > 0){
      this.pos--;
    }
  }
  next(){
    if(this.post < this.listSize-1){
      this.pos++;
    }
  }
  currPost(){
    return this.pos;
  }
  moveTo(position){
    this.pos = position;
  }
  getElement(){
    return this.dataStore[this.pos];
  }
}
cs

[test]

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
const list = new List();
list.append(1);
list.append(2);
list.append(3);
console.log(list.length);//3
console.log(list.find(3));//2 (index)
list.remove(2);
console.log(list.length);//2
console.log(list.toString());//[1, 3]
list.clear();
console.log(list.length);//0
list.append(1);
console.log(list.toString());
list.append(2);
list.append(3);
list.append(4);
list.append(5);
console.log(list.toString());//[1,2,3,4,5]
list.front();
console.log(list.getElement());//1
list.next();
console.log(list.getElement());//2
list.next();
list.next();
list.prev();
console.log(list.getElement());//3
cs

하면서 의문이 생겼던 것은 for-in문을 이용하면 요소가 'String'타입으로 나왔던 것이다.

또한 naver d2에서 본 것 같은데 for-in, for-of 구문보다 일반적인 for(;;)구문이 약간 더 빠르다고 해서 일단은 일반적인 for(;;)문으로 작성했다... 검색은 해봤는데 아직 for-in구문에서 value가 String인지 모르겠다. (검색중)

for문 반복할 때 계속 재할당(?)되니까 let 키워드 사용.

== 보다 === 비교 사용 권장.


침고 도서 : DataStructures & Algorithms with javascript



반응형