본문 바로가기

TIL LIST/JavaScript

7시간 짜리 코드

const n = 'new';
const l = 'list';
const c = 'clear';
const q = 'quit';

const toDoLists = [];


let command = prompt("오늘 무슨 일을 시작할 건가요?")

while (command !== q) {
  if (command === q) {
    break;
  } else if (command === n) {
    let toDo = prompt("새로운 리스트를 추가하세요.");
    toDoLists.push(toDo);
  } else if (command === l) {
    for(let i = 0; i < toDoLists.length; i++) {
      console.log(`${i}: ${toDoLists[i]}`);
    }
  } else if (command === c) {
    let index = parseInt(prompt("지울 번호를 입력하세요."));
    toDoLists.splice(index, 1);
  }
  command = prompt("오늘 무슨 일을 시작할 건가요?");
}

...

...

...휴

 

 

어디서 시간을 가장 많이 뺏겼냐 하면 역시 백지에서 while 반복문을 작성할 때. command에 quit을 입력하지 않으면 반복한다, command에 quit을 입력하면 반복을 break한다.를 작성하지 못해 계속 뻘짓했다. 

let command = prompt("오늘 무슨 일을 시작할 건가요?")
while (!command) {
  prompt("오늘 무슨 일을 시작할 건가요?");
  if (command === quit) break;
//   const quit = "quit";
//   if (toDo === quit.trim().toLocaleLowerCase()) {
//   break;
// }
}

틀린 구문 중 하나인데, 해당 구문을 실행했을 때 command prompt가 계속 실행되니 command에 quit를 입력하면 break가 걸리게 하는 게 목표였다.

 

아무것도 입력하지 않았을 때 prompt가 재실행되야 하므로 NOT 논리 연산자를 통해 거짓으로 반복문을 작성했고 만약 command에 quit이 입력되면 break 되게 한다. ...가 요지였다.

 

조심하지만 항상 간과하는 게 JavaScript는 HTML이나 CSS처럼 입력하면 바로바로 적용되는 게 아니다. 프로그래밍 언어기 때문에 프로그래밍 사고를 가져야 하는데 아직 연습이 되지 않아서 많이 슬프다.

 

JavaScript는 안의 컨텐츠가 무엇이 있던지 관심 없다. "오늘 무슨 일을 시작할 건가요?" 라는 스트링이 같아도 위 prompt와 반복문의 prompt는 완전히 다르다. 할당한 메모리가 다르기 때문이다. 그래서 맨처음 실행되는 prompt와 반복문 안의 prompt는 완전히 다르다. 그러므로 quit를 입력해도 안 먹혔던 것이다. (구문 자체도 틀렸지만) 

let command = prompt("오늘 무슨 일을 시작할 건가요?")
while (command ==! "quit" ) {
  prompt("오늘 무슨 일을 시작할 건가요?");
  if (command === quit) break;
}

그래서 만약 이렇게 고치더라도 prompt는 다르기 때문에 아무리 command에 quit을 입력해도 반복문이 사라지지 않는다.

맨 처음 quit을 명령하면 꺼지던 반복이 반복에 들어가서 quit를 명령하면 꺼지지 않는 다는 거다!!!! (경험담 아님! 진짜임!!!!!)

 

그리고 아주 기본적인 것들. break가 들어가야 할 if의 {}도 빠졌고, quit은 변수 처리를 안한 것 같고, 아무리 그래도 반복문 안 prompt에 command를 재할당해보는 노력이라도 해봤어야지. 

 

또 오답 중 가장 흔한 건 오타. for 구문에 세미클론 대신 반점을 찍는다거나(...), 명령어의 첫글자만 가져오고 싶은데 indexOf 메서드가 '글자를 가져오는 줄' 알았다거나, 심지어 그거도 메소드인데 (0)를 [0]로 적어 뭐가 문제인 지 알아내는 데만 한참 걸렸다거나, else에 command를 넣어 (어차피 command를 입력해 들어오면 전부 참인데... 그래서) command로 되돌아가지 못하거나, prompt에서 받아오는 데이터는 string이기 때문에 먹히지 않는다거나, clear 구문에서 toDoLists.length로 글자수를 계산해 뻘짓했는데 알고보니 다 지워도 먹혔다거나... 아! 나열하면 나열할 수록 슬픔만 가득하군.

 

그래도 이번 코드를 짜며 배운 것 중 하나는 나무가 아닌 산을 보듯이 넓게 코딩을 하는 방법이다.

먼저 명령어 변수를 할당하고 반복문을 실행한 뒤, 그 반복문 안에서 if ... else if로 명령어 섹션을 나눈 뒤 하나씩 작업했더니 머리가 복잡하지도 않고 알고리즘? 짜는 것도 훨씬 간편해졌고, 무엇보다 속도가 훨씬 빨라졌다!

맨처음 "어떻게 반복문을 멈추지?" 머리를 싸매고 몇시간 고민하던 게 무색해질 정도로...

 

여러 메서드는 말할 것도 없고.

고치고 지우고 고치고 지우고 고치고 지우고를 수백 번 해서 외우고 싶지 않아도 외워졌다.

 

아침 알람이 울린다.

이제 좀 자야겠다.