아래 조건을 만족하는 함수 sumInput()을 작성해 봅시다.
prompt 창을 띄워 사용자에게 숫자를 입력해 달라고 요청한 후, 입력받은 값들을 배열에 저장합니다.0은 유효한 숫자이므로, 사용자가 0을 입력하더라도 질문이 멈추지 말아야 합니다.function sumInput() {
let numbers = [];
while (true) {
let value = +prompt('숫자를 입력해 주세요.', 0);
if (value === null || value === '') break;
numbers.push(value);
}
let sum = 0;
for (let number of numbers) {
sum += number;
}
return sum;
}
제대로 동작하지 않았다. 숫자가 아닌 값을 입력해도 push가 되었고, break가 되지 않았다.
이 문제를 해결하는 데 어렵고 헷갈렸던 부분은 두 가지였다.
이 두가지였다. 이 두 문제는 서로 연관된 문제였다.
나중에 numbers에 push를 할 때 +value를 통해 숫자로 바꿔주려 했지만, 그렇게 된다면 prompt에서는 문자열로 받아와지기 때문에 if문에서 숫자인지 아닌지를 판별할 수 없다고 생각했다. 그렇게 하려면 문자열인 상태에서 if문에서 해결을 해야한다는 말인데... 문자열을 어떻게 숫자인지 아닌지 판별할 수 있을까? 라는 고민이 있었다.
몰랐던 개념을 앎으로써 문제를 해결했다.
문자열 내의 숫자라도 유한값인지 검사를 해주기에, 이 함수의 존재를 알고나니 문제 해결이 쉬워졌다. (isNaN 함수도 있으나 Infinity같은 무한한 숫자를 걸러내주지 못한다.) 유한한 숫자일 시 true를 반환하기 때문에, 여기서는 역으로 유한한 숫자이면 false를 반환할 수 있도록 !isFinite()로 변경해주었다. 판별이 해결됐기에 push 시 value를 숫자열로 바꿔주는 것도 가능했다.
function sumInput() {
let numbers = [];
while (true) {
let value = prompt('숫자를 입력해 주세요.', 0);
if (value === null || value === '' || !isFinite(value)) break;
numbers.push(+value);
}
let sum = 0;
for (let number of numbers) {
sum += number;
}
return sum;
}
아직 기본기가 부족하고 모르는 개념들이 많아서, 문제 풀이와 개념 공부를 한 쪽에 치우치지 않고 동시에 철저히 해야한다는 걸 느꼈다.